本文共享自华为云社区《一文讲透RocketMQ顾客是怎么负载均衡的》,作者:勇哥java实战共享。
RocketMQ 支撑两种音讯形式:集群消费( Clustering )和播送消费( Broadcasting )。
集群消费:同一 Topic 下的一条音讯只会被同一消费组中的一个顾客消费。也就是说,音讯被负载均衡到了同一个消费组的多个顾客实例上。
播送消费:当运用播送消费形式时,每条音讯推送给集群内一切的顾客,确保音讯至少被每个顾客消费一次。
咱们重点解说下集群消费的消费流程 ,因为集群消费是运用最遍及的消费形式,理解了集群消费,播送消费也就能顺理成章的把握了。
集群消费示例代码里,发动顾客,咱们需求配置三个核心特点:消费组名、订阅主题、音讯监听器,最终调用 start 办法发动。
顾客发动后,咱们能够将整个流程简化成:
负载均衡
消费端的负载均衡是指将 Broker 端中多个行列依照某种算法分配给同一个消费组中的不同顾客。
负载均衡是每个客户端独立进行核算,那么何时触发呢 ?
-
消费端发动时,当即进行负载均衡;
-
消费端守时任务每隔 20 秒触发负载均衡;
-
顾客上下线,Broker 端告诉顾客触发负载均衡。
负载均衡流程如下:
1、发送心跳
顾客发动后,它就会通过守时任务不断地向 RocketMQ 集群中的一切 Broker 实例发送心跳包(音讯消费分组名称、订阅联系调集、音讯通讯形式和客户端实例编号等信息)。
Broker 端在收到顾客的心跳音讯后,会将它保护在 ConsumerManager 的本地缓存变量 consumerTable,同时并将封装后的客户端网络通道信息保存在本地缓存变量 channelInfoTable 中,为之后做消费端的负载均衡提供能够依据的元数据信息。
2、发动负载均衡服务
下图展示了依照主题负载均衡的代码片段:
负载均衡服务会依据消费形式为”播送形式”还是“集群形式”做不同的逻辑处理,这儿首要来看下集群形式下的首要处理流程:
(1) 获取该主题下的音讯消费行列调集;
(2) 查询 Broker 端获取该消费组下顾客 Id 列表;
(3) 先对 Topic 下的音讯消费行列、顾客 Id 排序,然后用音讯行列分配战略算法(默认为:音讯行列的均匀分配算法),核算出待拉取的音讯行列;
这儿的均匀分配算法,相似于分页的算法,将一切 MessageQueue 排好序相似于记载,将一切消费端排好序相似页数,并求出每一页需求包括的均匀 size 和每个页面记载的范围 range ,最终遍历整个 range 而核算出当时消费端应该分配到的记载。
(4) 分配到的音讯行列调集与 processQueueTable 做一个过滤比对操作
顾客实例内 ,processQueueTable 目标存储着当时负载均衡的行列 ,以及该行列的消费快照。
标红的部分表示与分配到的音讯行列调集互不包括,则需求将这些赤色行列 Dropped 特点为 true , 然后从 processQueueTable 目标中移除。
绿色的部分表示与分配到的音讯行列调集的交集,processQueueTable 目标中已经存在该行列。
黄色的部分表示这些行列需求添加到 processQueueTable 目标中,创立这些行列的消费快照。最终创立拉取音讯恳求列表,并将恳求分发到音讯拉取服务,进入拉取音讯环节。
点击重视,第一时间了解华为云新鲜技术~