本文共享自华为云社区《一文讲透RocketMQ顾客是怎么负载均衡的》,作者:勇哥java实战共享。

RocketMQ 支撑两种音讯形式:集群消费( Clustering )和播送消费( Broadcasting )。

集群消费同一 Topic 下的一条音讯只会被同一消费组中的一个顾客消费。也就是说,音讯被负载均衡到了同一个消费组的多个顾客实例上。

RocketMQ消费者是如何负载均衡的

播送消费:当运用播送消费形式时,每条音讯推送给集群内一切的顾客,确保音讯至少被每个顾客消费一次。

RocketMQ消费者是如何负载均衡的

咱们重点解说下集群消费的消费流程 ,因为集群消费是运用最遍及的消费形式,理解了集群消费,播送消费也就能顺理成章的把握了。

RocketMQ消费者是如何负载均衡的

集群消费示例代码里,发动顾客,咱们需求配置三个核心特点:消费组名订阅主题音讯监听器,最终调用 start 办法发动。

顾客发动后,咱们能够将整个流程简化成:

RocketMQ消费者是如何负载均衡的

负载均衡

消费端的负载均衡是指将 Broker 端中多个行列依照某种算法分配给同一个消费组中的不同顾客

负载均衡是每个客户端独立进行核算,那么何时触发呢 ?

RocketMQ消费者是如何负载均衡的

  • 消费端发动时,当即进行负载均衡;

  • 消费端守时任务每隔 20 秒触发负载均衡;

  • 顾客上下线,Broker 端告诉顾客触发负载均衡。

负载均衡流程如下:

1、发送心跳

顾客发动后,它就会通过守时任务不断地向 RocketMQ 集群中的一切 Broker 实例发送心跳包(音讯消费分组名称订阅联系调集音讯通讯形式客户端实例编号等信息)。

Broker 端在收到顾客的心跳音讯后,会将它保护在 ConsumerManager 的本地缓存变量 consumerTable,同时并将封装后的客户端网络通道信息保存在本地缓存变量 channelInfoTable 中,为之后做消费端的负载均衡提供能够依据的元数据信息。

2、发动负载均衡服务

下图展示了依照主题负载均衡的代码片段:

RocketMQ消费者是如何负载均衡的

负载均衡服务会依据消费形式为”播送形式”还是“集群形式”做不同的逻辑处理,这儿首要来看下集群形式下的首要处理流程:

(1) 获取该主题下的音讯消费行列调集;

(2) 查询 Broker 端获取该消费组下顾客 Id 列表;

(3) 先对 Topic 下的音讯消费行列、顾客 Id 排序,然后用音讯行列分配战略算法(默认为:音讯行列的均匀分配算法),核算出待拉取的音讯行列;

RocketMQ消费者是如何负载均衡的

这儿的均匀分配算法,相似于分页的算法,将一切 MessageQueue 排好序相似于记载,将一切消费端排好序相似页数,并求出每一页需求包括的均匀 size 和每个页面记载的范围 range ,最终遍历整个 range 而核算出当时消费端应该分配到的记载。

(4) 分配到的音讯行列调集与 processQueueTable 做一个过滤比对操作

RocketMQ消费者是如何负载均衡的

顾客实例内 ,processQueueTable 目标存储着当时负载均衡的行列 ,以及该行列的消费快照。

标红的部分表示与分配到的音讯行列调集互不包括,则需求将这些赤色行列 Dropped 特点为 true , 然后从 processQueueTable 目标中移除。

绿色的部分表示与分配到的音讯行列调集的交集,processQueueTable 目标中已经存在该行列。

黄色的部分表示这些行列需求添加到 processQueueTable 目标中,创立这些行列的消费快照。最终创立拉取音讯恳求列表,并将恳求分发到音讯拉取服务,进入拉取音讯环节。

点击重视,第一时间了解华为云新鲜技术~