RocketMQ 如何做负载均衡?
通过 Topic 在多 Broker 中分布式存储实现。
(1)producer 端
发送端指定 message queue 发送消息到相应的 broker,来达到写入时的负载均衡
提升写入吞吐量,当多个 producer 同时向一个 broker 写入数据的时候,性能会下降
消息分布在多 broker 中,为负载消费做准备
默认策略是随机选择:
producer 维护一个 index
每次取节点会自增
index 向所有 broker 个数取余
自带容错策略
其他实现:
SelectMessageQueueByHash
hash 的是传入的 args
SelectMessageQueueByRandom
SelectMessageQueueByMachineRoom 没有实现
也可以自定义实现 MessageQueueSelector 接口中的 select 方法
MessageQueue select(final List<MessageQueue> mqs, final Message msg,
final Object arg);
(2) consumer 端
采用的是平均分配算法来进行负载均衡。
其他负载均衡算法
平均分配策略(默认)(AllocateMessageQueueAveragely)
环形分配策略(AllocateMessageQueueAveragelyByCircle)
手动配置分配策略(AllocateMessageQueueByConfig)
机房分配策略(AllocateMessageQueueByMachineRoom)
一致性哈希分配策略(AllocateMessageQueueConsistentHash)
靠近机房策略(AllocateMachineRoomNearby)
追问:当消费负载均衡 consumer 和 queue 不对等的时候会发生什么?
Consumer 和 queue 会优先平均分配,如果 Consumer 少于 queue 的个数,则会存
在部分 Consumer 消费多个 queue 的情况,如果 Consumer 等于 queue 的个数,那就是
一个 Consumer 消费一个 queue,如果 Consumer 个数大于 queue 的个数,那么会有部分 Consumer 空余出来,
白白的浪费了