首页 > 其他分享 >RocketMQ消费者是如何负载均衡的

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

时间:2023-05-05 11:01:04浏览次数:41  
标签:负载 消费 消费者 队列 消息 均衡 RocketMQ

摘要:RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )。

本文分享自华为云社区《一文讲透RocketMQ消费者是如何负载均衡的》,作者:勇哥java实战分享。

RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )。

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

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

广播消费:当使用广播消费模式时,每条消息推送给集群内所有的消费者,保证消息至少被每个消费者消费一次。

RocketMQ消费者是如何负载均衡的_广播消费_02

我们重点讲解下集群消费的消费流程 ,因为集群消费是使用最普遍的消费模式,理解了集群消费,广播消费也就能顺理成章的掌握了。

RocketMQ消费者是如何负载均衡的_消息队列_03

集群消费示例代码里,启动消费者,我们需要配置三个核心属性:消费组名订阅主题消息监听器,最后调用 start 方法启动。

消费者启动后,我们可以将整个流程简化成:

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

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

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

RocketMQ消费者是如何负载均衡的_集群消费_05

  • 消费端启动时,立即进行负载均衡;
  • 消费端定时任务每隔 20 秒触发负载均衡;
  • 消费者上下线,Broker 端通知消费者触发负载均衡。

负载均衡流程如下:

1、发送心跳

消费者启动后,它就会通过定时任务不断地向 RocketMQ 集群中的所有 Broker 实例发送心跳包(消息消费分组名称订阅关系集合消息通信模式客户端实例编号等信息)。

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

2、启动负载均衡服务

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

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

负载均衡服务会根据消费模式为”广播模式”还是“集群模式”做不同的逻辑处理,这里主要来看下集群模式下的主要处理流程:

(1) 获取该主题下的消息消费队列集合;

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

(3) 先对 Topic 下的消息消费队列、消费者 Id 排序,然后用消息队列分配策略算法(默认为:消息队列的平均分配算法),计算出待拉取的消息队列;

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

这里的平均分配算法,类似于分页的算法,将所有 MessageQueue 排好序类似于记录,将所有消费端排好序类似页数,并求出每一页需要包含的平均 size 和每个页面记录的范围 range ,最后遍历整个 range 而计算出当前消费端应该分配到的记录。

(4) 分配到的消息队列集合与 processQueueTable 做一个过滤比对操作

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

消费者实例内 ,processQueueTable 对象存储着当前负载均衡的队列 ,以及该队列的消费快照。

标红的部分表示与分配到的消息队列集合互不包含,则需要将这些红色队列 Dropped 属性为 true , 然后从 processQueueTable 对象中移除。

绿色的部分表示与分配到的消息队列集合的交集,processQueueTable 对象中已经存在该队列。

黄色的部分表示这些队列需要添加到 processQueueTable 对象中,创建这些队列的消费快照。最后创建拉取消息请求列表,并将请求分发到消息拉取服务,进入拉取消息环节。


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

标签:负载,消费,消费者,队列,消息,均衡,RocketMQ
From: https://blog.51cto.com/u_15214399/6245053

相关文章

  • RocketMQ笔记(十一):消息存储删除机制
    RocketMQ的消息采用文件进行持久化存储。1、存储目录详情RocketMQ中默认文件存储位置/root/store,文件详情如下 commitLog:消息存储目录config:运行期间一些配置信息consumerqueue:消息消费队列存储目录index:消息索引文件存储目录checkpoint:文件......
  • RocketMQ笔记(十):事务消息
    事务消息官网:RocketMQ官网-事务消息。一、什么是事务消息事务消息是RocketMQ提供的一种消息类型,支持在分布式场景下保障消息生产和本地事务的最终一致性。二、事务消息的原理2.1、事务消息的生命周期2.1.1、初始化半事务消息被生产者构建并完成初始化,待发......
  • RocketMQ笔记(八):顺序消息
    一、什么是顺序消息消息有序指的是可以按照消息的发送顺序来消费(FIFO)。顺序消息是RocketMQ提供的一种消息类型,支持消费者按照发送消息的先后顺序获取消息。顺序消息在发送、存储和投递的处理过程中,强调多条消息间的先后顺序关系。RocketMQ顺序消息的顺序关系通过消......
  • RocketMQ笔记(九):延时/定时消息
    一、什么是延时/定时消息定时/延时消息为RocketMQ中提供的一种消息类型。定时消息和延时消息本质相同,都是服务端根据消息设置的定时时间在某一固定时刻将消息投递给消费者消费。Producer将消息发送到消息队列RocketMQ服务端,但并不期望这条消息立马投递(被消费者消费),......
  • RocketMQ之消息存储
    一、概述消息持久化存储是MQ消息队列中最为复杂和最为重要的一部分,本文先从目前几种比较常用的MQ消息队列存储方式出发,为大家介绍RocketMQ选择磁盘文件存储的原因。然后,本文分别从RocketMQ的消息存储整体架构和RocketMQ文件存储模型层次结构两方面进行深入分析介绍。使得大家读完......
  • RocketMQ(四):RocketMQ概览
    一、普通消息普通消息为RocketMQ中最基础的消息,区别于有特性的顺序消息、定时/延时消息和事务消息普通消息一般应用于微服务解耦、事件驱动、数据集成等场景,这些场景大多数要求数据传输通道具有可靠传输的能力,且对消息的处理时机、处理顺序没有特别要求。1、普通消息......
  • 微服务 - Nginx网关 · 进程机制 · 限流熔断 · 性能优化 · 动态负载 · 高可用
    系列目录:微服务-概念·应用·通讯·授权·跨域·限流微服务-集群化·服务注册·健康检测·服务发现·负载均衡微服务-Redis缓存·数据结构·持久化·分布式·高并发本文的前提需要了解一些基础的Linux知识。以下围绕Nginx1.23的网关应......
  • 《企业级Linux高可用负载均衡集群实践真传》目录
    第1章关于负载均衡...21.1       负载均衡定义...21.2       负载均衡在生产环境中的基本要求...31.2.1在线可扩展性...31.2.2高可用性...31.2.3多服务性...41.3       负载均衡基本功能...41.3.1     负载均衡...41.3.2     健康......
  • 4.3.2 Nginx负载均衡器配置
    作者:田逸(formyz)存在两个项目,一个是Web服务集群,另一个是Python集群。将这两个集群置于同一个负载均衡器之下,有效利用资源。为了便于开展工作,先把资源分配列举出来,如表4-3所示。表4-3名称说明Web服务VIP地址及TCP端口172.16.35.188:80自定义Python服务地址及TCP端口172.16.35.189:10......
  • RocketMQ的简单使用
    大家好,我是Leo!今天来和大家分享RocketMQ的一些用法。领域模型介绍Producer:用于生产消息的运行实体。Topic:主题,用于消息传输和存储的分组容器。MessageQueue:消息传输和存储的实际单元容器。Message:消息传输的最小单元。ConsumerGroup:消费者组。Consumer:消费......