RocketMQ负载平衡机制解析!

消费者在消费信息的时刻,要求知道从Broker的哪一个信息队列中去失掉信息。

所以,在消费者端必定要做负载平衡,即Broker端中多个消费队列调配给同一个消费者组中的哪些消费者消费。

在RocketMQ中,在消费者端有一个:Rebalance负载平衡组件。

消费者负载平衡

指为消费组下的每个消费者调配订阅主题下的消费队列,调配了消费队列消费者就可以知道去消费哪个消费队列上方的信息。

而集群形式一个信息队列同一期间只能调配给组内的一个消费者启动消费。

RocketMQ5.0以前是依照队列粒度启动负载平衡的,5.0提供了按信息粒度启动负载平衡。

队列粒度负载平衡

队列粒度负载平衡战略中,同一消费者组内的多个消费者将依照队列粒度消费信息,每个队列只能被其中一个消费者消费。

队列粒度负载平衡是在每个消费者端启动的,并不是由某个节点一致启动负载平衡之后将调配结果通知到每个消费者。

消费者参与或许缩小会影响信息队列的调配,所以Broker要求感知消费者的高低线状况。

消费者在启动时会向一切的Broker发送心跳包启动注册,通知Broker消费者上线,下线的时刻也会向Broker发送敞开注册的恳求。

Broker会保养消费者信息的注册信息,在消费者出现变卦时会通知消费者启动负载平衡。

Rebalance触发机遇

消费者启动时触发:

消费者在启动时会启动一次性负载平衡,为自己调配信息队列。

Broker发现消费组变卦时触发:

处于以下两种状况之一时会被判别为消费组出现了变动,要求启动负载平衡:

被判定为变动之后,会触发变卦事情,向该消费者下的一切消费者发送发送变卦恳求,通知组下每个消费者启动负载平衡。

Broker收到消费者下线时触发:

假设有消费者向Broker发送UNREGISTER_CLIENT敞开注册恳求,并且开启了准许通知变卦,会触发变卦事情。

变卦事情同上,Broker会通知该消费者组下的一切消费者启动一次性负载平衡。

消费者定时触发:

消费者自身也会定时口头负载平衡,自动是20s口头一次性。

信息粒度负载平衡

在RocketMQ5.0之后,参与了信息粒度负载平衡战略,自动且仅经常使用信息粒度负载平衡战略。

信息粒度负载平衡战略中,同一消费组内的多个消费者将依照信息粒度平均摊派主题中的一切信息。

信息粒度负载平衡战略保障同一个队列的信息可以被组内多个消费者独特处置。

然而该战略经常使用的信息调配算法结果是随机的,不能指定信息被哪一个特定的消费者处置。

所以多个消费者同时消费同一个信息队列中的信息,服务端也可以保障信息不会被多个消费者重复消费。

信息粒度负载平衡战略适用于绝大少数在线处置的业务场景,关于流式处置、聚算计算等场景,更适宜队列粒度的负载平衡战略。

口头流程

负载平衡服务口头逻辑在doRebalance函数,外面会对每个消费者组口头负载平衡操作。

consumerTable这个map对象里存储了消费者组对应的的消费者实例。

private ConcurrentMapString MQConsumerInner consumerTable  new ConcurrentHashMapString MQConsumerInner void doRebalance {//每个消费者组都有负载平衡 MapEntryString MQConsumerInner entry : thisconsumerTableentrySet {MQConsumerInner impl  entrygetValue impl   {try {impldoRebalance} catch Throwable e {logerror e}}}}

由于每个消费者组或许会消费很多topic,每个topic都有自己的不同队列,最终是按topic的维度启动负载平衡。

public void doRebalance(final boolean isOrder) {Map<String, SubscriptionData> subTable = this.getSubscriptionInner();if (subTable != null) {for (final Map.Entry<String, SubscriptionData> entry : subTable.entrySet()) {final String topic = entry.getKey();try {//按topic维度口头负载平衡this.rebalanceByTopic(topic, isOrder);} catch (Throwable e) {if (!topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)) {log.warn("rebalanceByTopic Exception", e);}}}}this.truncateMessageQueueNotMyTopic();}

最终负载平衡逻辑处置的实如今:

其中分为广播信息和集群信息模型两种状况处置。

负载平衡外围性能的干流程,重要做了4件事情:

负载平衡战略原理

负载平衡战略顶层接口:

 interface AllocateMessageQueueStrategy {/*** Allocating by consumer id* 给消费者id调配消费队列*/ListMessageQueue allocatefinal String consumerGroup final String currentCID final ListMessageQueue mqAll final ListString cidAll }

他自动共有7种负载平衡战略成功。

最罕用的两种平均调配算法:

AllocateMessageQueueAveragely

是用总数除以消费者个数,余数按消费者顺序调配给消费者。

AlocateMessageQueueAveragelyByCircle

轮番一个一个调配。

参考:

您可能还会对下面的文章感兴趣: