负载均衡

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详解相关推荐

  1. RocketMQ两万字详解

    目录 简介 1.RocketMQ搭建(基于linux) 1.1 安装NameServer 1.2 安装Broker 1.3 控制台安装 2 .集成Spring Boot测试 2.1添加依赖 2.2 添 ...

  2. RocketMQ集群详解

    集群特点 (1)NameServer:是一个几乎无状态节点,可集群部署,节点之间无任何信息同步. (2)Broker:部署相对复杂,Broker分为Master与Slave,一个Master可以对应多 ...

  3. 从源码分析RocketMQ系列-RocketMQ消息设计详解

    1 消息存储   消息存储是RocketMQ中最为复杂和最为重要的一部分,本节将分别从RocketMQ的消息存储整体架构.PageCache与Mmap内存映射以及RocketMQ中两种不同的刷盘方式三 ...

  4. RocketMQ的Consumer详解之重复消息的解决方案

    重复消息的解决方案 造成消息重复的根本原因是:网络不可达.只要通过网络交换数据,就无法避免这个问题.所以解决这个问题的办法就是绕过这个问题.那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理 ...

  5. RocketMQ的Consumer详解之push和pull模式(长轮询)

    push和pull模式 在RocketMQ中,消费者有两种模式,一种是push模式,另一种是pull模式. push模式:客户端与服务端建立连接后,当服务端有消息时,将消息推送到客户端. pull模式 ...

  6. RocketMQ的Producer详解之分布式事务消息(代码实现以及过程分析)

    执行流程 1. 发送方向 MQ 服务端发送消息. 2. MQ Server 将消息持久化成功之后,向发送方 ACK 确认消息已经发送成功,此时消息为半消息. 3. 发送方开始执行本地事务逻辑. 4. ...

  7. Kafka 消费者组 Rebalance 详解

    Rebalance作用 Rebalance 本质上是一种协议,主要作用是为了保证消费者组(Consumer Group)下的所有消费者(Consumer)消费的主体分区达成均衡. 比如:我们有10个分 ...

  8. 第6章 Rebalance详解

    rebalance本质是一种协议,规定了一个consumer group下的所有consumer如何达成一致来分配订阅的topic的每个分区.比如某个group下有20个consumer,它订阅了一个 ...

  9. Kafka Consumer Rebalance详解

    全网最全大数据面试提升手册! 文章目录 Kafka版本 rebalance rebalance策略 rebalance generation rebalance协议 rebalance流程 rebal ...

最新文章

  1. 树莓派 之 系统登陆及设置本地化(简体中文)
  2. Python与风水 的‘’南北通透‘’住宅与‘’南北” 向住宅的均价数据分析
  3. request对象简介和获取客户机信息
  4. 使用jasmine.createSpyObj具有依赖关系的Angular服务进行单元测试
  5. 为什么中国学生会越学越呆?
  6. 轻松背后的N+疲惫——系统日志
  7. 寻路算法:找到NPC最好的行走路径
  8. 计算机桌面如何分区,展示电脑如何分区
  9. 怎么把两个pdf合并成一个pdf?
  10. NodeJS:图片验证码登录
  11. UINO优锘:产品实施“八步法”让客户感受DCV实施的专业性
  12. uc android 面试题,一道新浪UC部门软件测试面试题
  13. matlab做偏最小二乘回归
  14. 在python中、int表示的数据类型是_python--002--数据类型(int、str)
  15. 【SSD-Caffe】安装使用教程
  16. 从零开始的VUE项目-03(数据的增删改查)
  17. Windows 定时启动 关闭软件
  18. 量子计算机 最先进国家,中国获得量子霸权,玻色取样取得重大成功,成为当今量子技术最先进的国家。...
  19. Java程序员常用网站总结
  20. 【超低功耗智能门锁】Si522A/Si523/Si512--具有超低功耗自动载波侦测功能(ACD功能)的13.56MHz芯片,智能屏蔽触摸功能

热门文章

  1. CCF 模拟题,公共钥匙盒
  2. iOS开发钥匙串保存信息
  3. 网络编程面试汇总(C++)
  4. 全球便携式彩色超声设备行业收入预计2028年达到12.755亿美元
  5. 旗帜软件工作室年会总结
  6. vue SEO的解决方案
  7. “ 请找出下面重复的字”
  8. 去除WinRAR 5.01(32位) NAG窗口
  9. 将base64加密之后的图片文件流写为文件
  10. 安卓来电归属地_比尔·盖茨懊悔让微软损失4000亿美金!当年为何会与安卓失之交臂?...