参考答案
负载均衡(LB,Load Balance),是一种技术解决方案,用来在多个资源(一般是服务器)中分配负载,达到最优化资源使用,避免单台服务器过载。
RocketMQ 中的负载均衡,主要可以分为 Producer 发送消息的负载均衡、Consumer 订阅消息的负载均衡。
1 producer 发送消息的负载均衡
默认会轮询向 Topic 的所有queue 发送消息,以达到消息平均落到不同的 queue 上;
但由于 queue 可以落在不同的 broker上 ,就可以发到不同 broker 上(当然也可以指定发送到某个特定的 queue 上)
2 consumer订阅消息的负载均衡
假设有5个队列,两个消费者,则第一个消费者消费3个队列,第二个则消费2个队列,以达到平均消费的效果。
注意,当 consumer 的数量大于队列的数量时,根据 RocketMQ 的机制,多出来的Consumer 不会去消费数据。
因此,建议 Consumer 的数量小于或者等于queue的数量,避免不必要的浪费。
通过 Topic ,在多个 Broker 中分布式存储实现。
producer端
发送端指定 message queue 发送消息到相应的 broker ,来达到写入时的负载均衡。
consumer端
采用的是平均分配算法来进行负载均衡。
其他负载均衡算法
- 平均分配策略(默认)(AllocateMessageQueueAveragely)
- 环形分配策略(AllocateMessageQueueAveragelyByCircle)
- 手动配置分配策略(AllocateMessageQueueByConfig)
- 机房分配策略(AllocateMessageQueueByMachineRoom)
- 一致性哈希分配策略(AllocateMessageQueueConsistentHash)
- 靠近机房策略(AllocateMachineRoomNearby)
延伸题目:
当消费负载均衡 consumer 和 queue不对等时,会发生什么?
Consumer 和 queue 会优先平均分配。
- 如果 Consumer 少于queue 的个数,则会存在部分Consumer 消费多个 queue 的情况。
- 如果 Consumer 等于queue 的个数,那就是一个 Consumer 消费一个 queue ,如果 Consumer 个数大于 queue 的个数,那么会有部分 Consumer 空余出来,白白的浪费了。
以上,是消息队列 RocketMQ 面试题【RocketMQ 如何做负载均衡?】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—