消息队列MQ知识点
2024-06-25 20:27:01 9 举报
AI智能生成
MQ的简单知识点梳理
作者其他创作
大纲/内容
为什么用?
1、解耦
2、异步
3、削峰
如何选择?
1、RabbitMQ
优势
轻量
支持语言多
劣势
消息堆积支持不友好,性能会急剧下降
性能一般,秒级处理几万到十几万
扩展和二次开发成本高(Erlang 语言开发)
2、Kafka
优势
兼容性好
性能高效,秒级处理几十万,理论极限超 2000 万(异步且开启压缩的条件下)
可扩展性良好
可持久化
可复制、可容错(分区特性导致)
劣势
收发消息时,响应时延较高(因为设计思想是批量发送)
topic达到上百个时,吞吐量会大幅度下降
3、RocketMQ
优势
高性能(秒级几十万)
稳定可靠
响应时延低(毫秒级)
有活跃的中文社区,便于问题处理
扩展和二次开发相对容易(基于 Java)
劣势
和其他生态的集成以及兼容度一般
为何消息不丢失?
1、确保消息到 MQ
发送方的确认模式(回调)
2、确保消息路由到正确的队列
路由失败通知(回调)
3、确保消息在队列正确的存储
持久化
4、确保消息从队列中正确的投递到消费者
消费者手动确认
控制异常以及重发机制
为什么有消息重复?
导致原因
发送重复
消费重复
解决方案
消费者的操作保持幂等性
乐观锁(多版本并发控制),
发送时的版本号要与消费时的版本号进行匹配
发送时的版本号要与消费时的版本号进行匹配
利用去重表,以业务唯一标识进行插入,重复插入会失败
RocketMQ如何性能调优?
(理论达到80W)
(理论达到80W)
JVM 层面
关闭官方的自带监控
JDK8消除偏向锁
-XX:-UseBiasedLocking
垃圾回收参数
使用G1 垃圾回收器
-XX:+UseG1GC
-XX:+UseG1GC
设置 G1 的 region 大小为 16m,减少region数量
-XX:G1HeapResionSize=16m
-XX:G1HeapResionSize=16m
设置 G1 的老年代预留 25%的空闲内存(默认 10%),为新生代进入到老年代提供充足内存
-XX:G1ReservePercent=25
-XX:G1ReservePercent=25
设置当堆内存使用率达到 30%(默认 45%)之后就会进行 G1 的并发垃圾回收,提高 GC 频率
-XX:initiatingHeadOccupancyPercent=30
-XX:initiatingHeadOccupancyPercent=30
操作系统层面
内存分配策略
vm.overcommit_memory=1
vm.overcommit_memory=1
0:用户申请内存时,内核会检查是否有这么大的空间
1:用户申请内存时,内核始终认为有足够空间,直到用完
2:内核禁止任何形式的过量分配内存
交换区
推荐值如下,默认为 60
vm.swappiness=10
vm.swappiness=10
进程拥有的最多内存区域
默认为 65536
vm.max_max_count=655360
vm.max_max_count=655360
用户能打开的最大文件数
提高并发
ulimit=1000000
ulimit=1000000
网卡
设置缓冲区Ring Buffer大小
一定程度可以缓解丢包的状况
一定程度可以缓解丢包的状况
关闭 IRQBalance
影响 CPO 的使用均衡
0 条评论
下一页