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 ...
最新文章
- SIFT特征提取-应用篇
- redis setnx 过期时间_阿里面试官:你确定你用过 Redis 分布式锁吗?
- MOCTF-Web-登录就对了
- Asp.net页面之间传递参数的几种方法
- java线程基础(一些常见多线程用法)
- 新媒体营销操作手法及案例分享-初贵民
- .net mvc 一个Action的 HttpGet 和 HttpPost
- 震惊!等待时间竟然用for循环!
- java判断浏览器杂项_杂 项 - HelloJava菜鸟社区
- 511遇见易语言列表框去重复项目到列表框
- 计算机音乐谱大全极乐净土,极乐净土maria曲谱
- 毕设全记录——探索 JavaBDD
- 编写myqq,即时聊天脚本
- 使用lua脚本开发wow插件(魔兽世界插件开发·二)
- 线段树--暴力修改专题浅谈
- 用户画像第四章(企业级360°用户画像_标签开发_挖掘标签_用户购物性别模型-USG)
- 每个人都在努力证明自己曾经存在过
- 招行零售金融3.0数字化转型实践
- 华为服务器开虚拟化,华为服务器虚拟化的随笔
- ZCMU--5066: 黑暗长廊
热门文章
- 带你走进 ERNIE
- Android系统 —— image文件解析
- 关于poi/Npoi创建批注后,EXCEL不能显示,wps能显示的问题
- 安卓报错:E/EGL_adreno: tid 2148: eglSurfaceAttrib(1338): error 0x3009 (EGL_BAD_MATCH)
- 怎样在手机自带的邮件服务器,如何在手机上收发学校邮箱信件
- 网页转pdf乱码问题,楷体部分出乱码
- (转)FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)
- 使用 MoveIt 控制自己的真实机械臂【2】——编写 action server 端代码
- 【Antdv】input type=number去掉上下箭头、提示文字、鼠标滚轮
- 【matlab】函数meshgrid的用法详解(生成网格矩阵)和ndgrid的区别及用法