RocketMQ消费者是如何负载均衡的
摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )。
本文分享自华为云社区《一文讲透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 对象中,创建这些队列的消费快照。最后创建拉取消息请求列表,并将请求分发到消息拉取服务,进入拉取消息环节。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
X.Org 基金离开 SPI ,转投 SFC 自由软件保护协会
经过社区成员的投票,X.Org 基金会将脱离公益软件协会 SPI 转到软件自由保护协会 SFC的旗下,由 SFC作为其财务赞助商及管理者。 公益软件协会 SPI 全称 Software in the Public Interest,起初是为了公开透明地对 Debian 项目进行捐赠而创建,现在已成为 40 多项自由和开源项目的财政赞助商,包括我们熟悉的 Arch Linux 、Debian 、Ffmpeg、PostgreSQL 等。 X.Org 基金会在 2016 年加入了 SPI ,但近年来基金会成员总觉得 SPI 处理事务的效率太慢(估计赞助的资金也不太充足),合作不愉快,想要寻找新的组织投靠。从X.Org 的会议记录也能看出成员的怨气: 而软件自由保护协会 SFC(Software Freedom Conservancy)一直是 X.Org 基金会的主要财政赞助商。作为最大的金主爸爸,SFC 一直希望 X.Org 基金会转投到自家名下。 在今年的 X.Org 董事会选举中,X.Org 基金会顺水推舟,对 “是否放弃 SPI ,转到 SFC 名下” 问题进行了社区全员投票。 投票结...
- 下一篇
架构师日记-深入理解软件设计模式 | 京东云技术团队
作者:京东零售 刘慧卿 一 设计模式与编程语言 1.1 什么是设计模式 设计模式(Design pattern) :由软件开发人员在软件开发中面临常见问题的解决方案,是经过长时间的试验积累总结出来的,它使设计更加灵活和优雅,复用性更好。从实用的角度来看,它代表了某一类问题的最佳实践。 设计模式到底解决了开发过程中的哪些难题呢,它又是如何来解决的呢? 其核心是:复用和解耦。使不稳定依赖于稳定、具体依赖于抽象,以此增强软件设计适应变化的能力。 1.2 什么是编程范式 要探讨设计模式和编程语言的关系,还得从编程范式谈起。编程范式一词最早来自 Robert Floyd 在 1979 年图灵奖的颁奖演说,是程序员看待程序的观点,代表了程序设计者认为程序应该如何被构建和执行的看法,与软件建模方式和架构风格有紧密关系。 当前主流的编程范式有三种: 1.结构化编程(structured programming) 2.面向对象编程(object-oriented programming) 3.函数式编程(functional programming) 这几种编程范式之间的关系如下: 1.起初是非结构化编...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址