RocketMQ 如何做负载均衡?

参考答案

负载均衡(LB,Load Balance),是一种技术解决方案,用来在多个资源(一般是服务器)中分配负载,达到最优化资源使用,避免单台服务器过载。

RocketMQ 中的负载均衡,主要可以分为 Producer 发送消息的负载均衡、Consumer 订阅消息的负载均衡。

1    producer 发送消息的负载均衡

默认会轮询向 Topic 的所有queue 发送消息,以达到消息平均落到不同的 queue 上;

但由于 queue 可以落在不同的 broker上 ,就可以发到不同 broker 上(当然也可以指定发送到某个特定的 queue 上)

RocketMQ 如何做负载均衡?

2    consumer订阅消息的负载均衡

假设有5个队列,两个消费者,则第一个消费者消费3个队列,第二个则消费2个队列,以达到平均消费的效果。

注意,当 consumer 的数量大于队列的数量时,根据 RocketMQ 的机制,多出来的Consumer 不会去消费数据。

因此,建议 Consumer 的数量小于或者等于queue的数量,避免不必要的浪费。

通过 Topic ,在多个 Broker 中分布式存储实现。

RocketMQ 如何做负载均衡?

 

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—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧