消息消费负载和重新分布机制|学习笔记

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 快速学习消息消费负载和重新分布机制

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)消息消费负载和重新分布机制】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/704/detail/12502


消息消费负载和重新分布机制


负载均衡的过程与算法介绍

RocketMQ 消息队列重新分配是由 RebalanceService 线程负责的。线程的启动会随着MQClientinstance的启动而启动。

MQClientinstance  其中会有这么一行代码:

this.rebalanceService.start();

也就是start会启动 rebalanceService 线程。

这个线程在启动之后,就会去调用客户端的  dorebalance  方法,下面是这个方法的代码:

public void doRebalance(){

for (Map.Entry entry : this.consumerTable.entryset()){

MQConsumerInner impl = entry .getValue();

if ( impl !=null){

try {  impl.doRebalance();

catch ( Throwable e) {

log.error( "doRebalance exception", e);}

它会进行负载均衡,重新分布的时候,以上代码部分会去遍历每个主题的订阅的队列,然后重新进行一个负载啊,所以整个地方是根据主题的一个订阅信息。然后会去遍历,针对每一个消费方去进行一个负载。

image.png进入  doRebalance  之后,发现有两种方式,一种是推送方式(DefaultMQPushConsumerImpl),一种是拉取方式(DefaultMQPullConsumerImpl),

推送方式。代码如下:

public void doRebalance(final boolean isOrder) {

Map subTable = this.getSubscriptionInner();

if ( subTable != null){

for (final Map.Entry entry : subTable.entrySet()){

final String topic = entry.getKey();

try {

this.rebalancByTopic(topic, isOrder);

}catch (Throwable e) {

if(!topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)){

Log.warn("rebalanceByTopic Exception", e);}

真正的负载会根据主题(Topic)去进行负载,这个地方传了一个topic, 所以进入 rebalanceByTopic,

负载均衡对于广播模式(messageModel)来讲其实没有太大的意义,因为广播模式的每一个客户端都要去消费当前主题下所有的队列,最多做更新的处理。

case CLUSTERING:{

Set mqSet = this.topicSubscribeInfoTable.get(topic);

List cidAll =

this.mQClientFactory.findConsumerIdList(topic,consumerGroup);

if(null == mqSet){

if (!topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)){

Log.warn("doRebalance,{},but the topic[{}] not exist.",

consumerGroup,topic);}

}

if(null == cidAll){

log.warn("doRebalance, {} {},get consumer id list failed", consumerGroup,topic);}

而真正的负载均衡是发生在集群模式下。它首先是拿到当前主题的这个队列(topic),再去拿到 cidAll ,也就是当前的所有主题客户端,

如下两个进行排序:

Collections.sort(mqAll)  Collections.sort(cidAll);

排完序之后,根据负载均衡的策略去进行一个重新的一个分布。

负载均衡的策略有五种。比较常用的有两种,一种叫做AllocateMessageQueueAveragely,另外一种就是AllocateMessageQueueAveragelyByCircle。

RocketMQ 默认提供5中负载均衡分配算法,下面是常见的两种:

AllocateMessageQueueAveragely : 平均分配

举例:8个队列q1,q2,q3,q4, q5 ,q6 ,q7,q8 ,消费者3个:c1,c2,c3分配如下:

c1:q1,q2 ,q3; c2:q4, q5 ,q6;c3:q7,q8

AllocateMessageQueueAveragelyByCircle:平均轮询分配

举例:8个队列q1,q2,q3,q4, q5 ,q6,q7 ,q8 ,消费者3个:c1,c2,c3分配如下:

c1:q1,q4 ,q7;c2:q2,q5,q8;c3:q3, q6

这两种的区别是:举一个例子:比如现在有八个队列,三个消费者,如果是第一种方式,真正负载的情况是:就是 C1 客户端负责消费一23,C2 负责消费456,C3 负责消费78;如果是第二种方式,在这种情况下,它的这三个消费者的负载是这样的: C1负责消费 Q1,Q4,Q7。C2 负责消费258, C3 负责消费36,它是一个循环的过程。这是两种比较常用的负载均衡的方式,在 MQ 当中这两种方式都可以使用。

注意事项:消息队列的分配遵循一个消费者可以分配到多个队列,但是同一个消息队列只能分配给一个消费者。所以如果出现消费者的个数大于队列的个数,那有些消费者就无法消费消息。以上就是关于负载均衡的过程以及具体负载均衡的算法。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
消息中间件 算法 Java
弥补延时消息的不足,RocketMQ 基于时间轮算法实现了定时消息!
弥补延时消息的不足,RocketMQ 基于时间轮算法实现了定时消息!
788 1
弥补延时消息的不足,RocketMQ 基于时间轮算法实现了定时消息!
|
1月前
|
消息中间件 存储 监控
MQ线上大规模消息堆积问题处理及使用场景详解
【11月更文挑战第21天】在如今的高并发互联网应用中,消息队列(Message Queue,简称MQ)扮演着至关重要的角色
102 1
|
5月前
|
消息中间件 RocketMQ
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
MetaQ/RocketMQ 原理问题之当消费集群规模较大时,处理分配不到队列的Consumer的问题如何解决
|
7月前
|
消息中间件 RocketMQ
在RocketMQ中,消息的读写与生产者消费者的数量以及Broker数量都有关
在RocketMQ中,消息的读写与生产者消费者的数量以及Broker数量都有关
254 1
|
7月前
|
消息中间件 监控 Kafka
保证消息顺序性:Kafka 的策略与挑战
保证消息顺序性:Kafka 的策略与挑战
|
7月前
|
消息中间件 监控 中间件
【工作中问题解决实践 十一】Kafka消费者消费堆积且频繁rebalance
【工作中问题解决实践 十一】Kafka消费者消费堆积且频繁rebalance
498 0
|
消息中间件 RocketMQ 索引
RocketMQ消费者如何实现重平衡
RocketMQ消费者如何实现重平衡
538 0
|
消息中间件 Kafka RocketMQ
Kafka重平衡机制
当集群中有新成员加入,或者某些主题增加了分区之后,消费者是怎么进行重新分配分区再进行消费的?这里就涉及到重平衡(Rebalance)的概念,下面我就给大家讲解一下什么是 Kafka 重平衡机制,我尽量做到图文并茂通俗易懂。
1346 0
Kafka重平衡机制
|
消息中间件 缓存 数据库
4 张图,9 个维度告诉你怎么做能确保 RocketMQ 不丢失消息
4 张图,9 个维度告诉你怎么做能确保 RocketMQ 不丢失消息
429 0
4 张图,9 个维度告诉你怎么做能确保 RocketMQ 不丢失消息
|
消息中间件 算法 RocketMQ
RocketMQ重平衡策略你用过几种?
RocketMQ重平衡策略你用过几种?
601 0
RocketMQ重平衡策略你用过几种?

热门文章

最新文章