RocketMq-负载均衡
2020-12-17 本文已影响0人
麦大大吃不胖
by shihang.mai
1. 创建Topic
- 当自动创建topic时,会随机找一个borker生产queue
- 当我们在console界面创建topic时,会同时操作多个borker的queue。例如不能做到borkerA = 3queue borkerB=2quque
我们可以用mqadmin 命令创建自有queue的Topic
2. producer端
发送的时候可以用MessageQueueSelector类去发送。
3. consumer端
-
consumer端的数量最好和MessageQueue数量对等或者是倍数
-
consumer端有以下几种负载均衡策略,默认使用平均分配
- 平均分配(AllocateMessageQueueAveragely)
- 环形分配(AllocateMessageQueueAveragelyByCircle)
- 手动配置分配(AllocateMessageQueueByConfig)
- 机房分配(AllocateMessageQueueByMachineRoom)
- 一致性哈希分配(AllocateMessageQueueConsistentHash)
- 靠近机房分配(AllocateMachineRoomNearby)
4. 消息堆积
现象: mq消息堆积20亿
问题原因: 当时我们的Topic用了32个queue,consumerGroup线程数只有10几个.queue的数远多于consumer的数
解决方式
- 先4个工程都设置consumerGroup的线程数=32,那么就一共有128个消费线程
- 自测一次业务需要40ms
- 预测需要18小时才能消费完,实际上18小时多一点
- 为了避免新告警延迟,创建一个新的消费组,线程数也是32,也是4个工程,fromwhere设置为最新的offset
- 代码中加入逻辑,当消费到当前offset时,不消费.这样旧消费组继续消费,新消费组消费新的告警,并且也避免旧消费组重复消费