负载均衡

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. SIFT特征提取-应用篇
  2. redis setnx 过期时间_阿里面试官:你确定你用过 Redis 分布式锁吗?
  3. MOCTF-Web-登录就对了
  4. Asp.net页面之间传递参数的几种方法
  5. java线程基础(一些常见多线程用法)
  6. 新媒体营销操作手法及案例分享-初贵民
  7. .net mvc 一个Action的 HttpGet 和 HttpPost
  8. 震惊!等待时间竟然用for循环!
  9. java判断浏览器杂项_杂 项 - HelloJava菜鸟社区
  10. 511遇见易语言列表框去重复项目到列表框
  11. 计算机音乐谱大全极乐净土,极乐净土maria曲谱
  12. 毕设全记录——探索 JavaBDD
  13. 编写myqq,即时聊天脚本
  14. 使用lua脚本开发wow插件(魔兽世界插件开发·二)
  15. 线段树--暴力修改专题浅谈
  16. 用户画像第四章(企业级360°用户画像_标签开发_挖掘标签_用户购物性别模型-USG)
  17. 每个人都在努力证明自己曾经存在过
  18. 招行零售金融3.0数字化转型实践
  19. 华为服务器开虚拟化,华为服务器虚拟化的随笔
  20. ZCMU--5066: 黑暗长廊

热门文章

  1. 带你走进 ERNIE
  2. Android系统 —— image文件解析
  3. 关于poi/Npoi创建批注后,EXCEL不能显示,wps能显示的问题
  4. 安卓报错:E/EGL_adreno: tid 2148: eglSurfaceAttrib(1338): error 0x3009 (EGL_BAD_MATCH)
  5. 怎样在手机自带的邮件服务器,如何在手机上收发学校邮箱信件
  6. 网页转pdf乱码问题,楷体部分出乱码
  7. (转)FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)
  8. 使用 MoveIt 控制自己的真实机械臂【2】——编写 action server 端代码
  9. 【Antdv】input type=number去掉上下箭头、提示文字、鼠标滚轮
  10. 【matlab】函数meshgrid的用法详解(生成网格矩阵)和ndgrid的区别及用法