RocketMQ的Rebalance详解
负载均衡
RocketMQ的消费负载是通过queue来对消息进行分片,然后consumer消费自己对应的queue来实现。我们以如下场景为例:
- topicA有两个队列:queue1和queue2。
- 消费组groupA有一台机器:consumer1
queue分配如下图所示,由于只有一台消费者机器,所以分布在queue1和queue2的消息都被consumer1消费掉。
如果这个时候开发人员收到消息积压告警,说明一个consumer已经无法及时处理所有消息了,对于这种情况通常会选择对消费集群进行扩容。于是新增了一台机器consumer2来协助处理积压的消息。情况变成下图所示:
Rebalance
这里需要大家思考一下,rocket是如何把queue2从consumer1调整到consumer2的?这里只是一个简单的实例,真实环境下可能是十几个queue对应十几个consumer。这样的对应关系更复杂,如果新增或删除一些consumer节点都需要去重新调整消费关系。
其实rocket是通过Rebalance机制来完成queue和consumer关系的协调的。Rebalance的意思就是再平衡。Relanace机制是如何实现消费关系再平衡呢?其内部的运转机制又是如何?我们接下来一探究竟。
rocket的Rebalance是在消费者侧实现的,这里大家不禁会疑惑,消费者都是相互独立的,如何能一同协调消费关系?不会出现脑裂的情况吗?
rocket是这么实现Rebalance:
- 触发时机
- 在consumer启动或者停止的时候,此时consumer的数量发生变动,消费者会主动触发一次Rebalance。
- 收到broker发送的rebalance通知时。
- 消费者启动后会通过一个异步线程每隔20s触发一次Rebalance。
- 向服务端获取topicA最新的queue列表和consuemr节点列表,根据这些最新的信息重新分配消费关系
- 分配策略
- rocket提供多个分配策略,消费机器不同但是内部代码是相同的,所以会选择相同的分配策略,通过相同的策略来保证不同的消费者执行Rebalance后得到相同的分配结果。这里大家可能会提问是否会存在一些切换的间隙,分配不一致的情况呢?的确存在,这时可能会导致不同消费者重复消费同一个queue的消息,但是这种状态是短暂的,而且可以通过幂等校验来规避业务上的影响。通过多次的Rebalance最终会达到稳定。稳定会持续到下一次平衡关系的破坏。
- 消费关系分配完成后客户端会对比之前的消费关系是否发生改变,如果有新增的queue则将其加入到pullRequest请求队列中,如果之前消费的某个queue被移除,则将其标记为drop,后续流程通过这个标记会将其从pullRequest队列中剔除
Rebalance流程图
顺序消息的Rebalance
顺序消息在Rebalance过程中是如何做到保证严格的顺序的呢?其实也很简单粗暴,直接向broker发起queue上锁请求,上锁成功之后才能完成关系调整,代码如下:
if (isOrder && !this.lock(mq)) {log.warn("doRebalance, {}, add a new mq failed, {}, because lock failed", consumerGroup, mq);continue;
}
总结
以上就是对Rebalance流程的介绍,rocket通过客户端实现来降低设计难度,消费端通过幂等来规避短暂Rebalance所带来的消息重复的影响。
RocketMQ的Rebalance详解相关推荐
- RocketMQ两万字详解
目录 简介 1.RocketMQ搭建(基于linux) 1.1 安装NameServer 1.2 安装Broker 1.3 控制台安装 2 .集成Spring Boot测试 2.1添加依赖 2.2 添 ...
- RocketMQ集群详解
集群特点 (1)NameServer:是一个几乎无状态节点,可集群部署,节点之间无任何信息同步. (2)Broker:部署相对复杂,Broker分为Master与Slave,一个Master可以对应多 ...
- 从源码分析RocketMQ系列-RocketMQ消息设计详解
1 消息存储 消息存储是RocketMQ中最为复杂和最为重要的一部分,本节将分别从RocketMQ的消息存储整体架构.PageCache与Mmap内存映射以及RocketMQ中两种不同的刷盘方式三 ...
- RocketMQ的Consumer详解之重复消息的解决方案
重复消息的解决方案 造成消息重复的根本原因是:网络不可达.只要通过网络交换数据,就无法避免这个问题.所以解决这个问题的办法就是绕过这个问题.那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理 ...
- RocketMQ的Consumer详解之push和pull模式(长轮询)
push和pull模式 在RocketMQ中,消费者有两种模式,一种是push模式,另一种是pull模式. push模式:客户端与服务端建立连接后,当服务端有消息时,将消息推送到客户端. pull模式 ...
- RocketMQ的Producer详解之分布式事务消息(代码实现以及过程分析)
执行流程 1. 发送方向 MQ 服务端发送消息. 2. MQ Server 将消息持久化成功之后,向发送方 ACK 确认消息已经发送成功,此时消息为半消息. 3. 发送方开始执行本地事务逻辑. 4. ...
- Kafka 消费者组 Rebalance 详解
Rebalance作用 Rebalance 本质上是一种协议,主要作用是为了保证消费者组(Consumer Group)下的所有消费者(Consumer)消费的主体分区达成均衡. 比如:我们有10个分 ...
- 第6章 Rebalance详解
rebalance本质是一种协议,规定了一个consumer group下的所有consumer如何达成一致来分配订阅的topic的每个分区.比如某个group下有20个consumer,它订阅了一个 ...
- Kafka Consumer Rebalance详解
全网最全大数据面试提升手册! 文章目录 Kafka版本 rebalance rebalance策略 rebalance generation rebalance协议 rebalance流程 rebal ...
最新文章
- 树莓派 之 系统登陆及设置本地化(简体中文)
- Python与风水 的‘’南北通透‘’住宅与‘’南北” 向住宅的均价数据分析
- request对象简介和获取客户机信息
- 使用jasmine.createSpyObj具有依赖关系的Angular服务进行单元测试
- 为什么中国学生会越学越呆?
- 轻松背后的N+疲惫——系统日志
- 寻路算法:找到NPC最好的行走路径
- 计算机桌面如何分区,展示电脑如何分区
- 怎么把两个pdf合并成一个pdf?
- NodeJS:图片验证码登录
- UINO优锘:产品实施“八步法”让客户感受DCV实施的专业性
- uc android 面试题,一道新浪UC部门软件测试面试题
- matlab做偏最小二乘回归
- 在python中、int表示的数据类型是_python--002--数据类型(int、str)
- 【SSD-Caffe】安装使用教程
- 从零开始的VUE项目-03(数据的增删改查)
- Windows 定时启动 关闭软件
- 量子计算机 最先进国家,中国获得量子霸权,玻色取样取得重大成功,成为当今量子技术最先进的国家。...
- Java程序员常用网站总结
- 【超低功耗智能门锁】Si522A/Si523/Si512--具有超低功耗自动载波侦测功能(ACD功能)的13.56MHz芯片,智能屏蔽触摸功能