【RocketMQ】Rebalance负载均衡总结

rocketmq,rebalance,负载,均衡,总结 · 浏览次数 : 18

小编点评

**消费者负载均衡** **集群模式** 由于广播模式,所有的消息队列都可以被消费者组下的每个消费者消费,负载均衡策略无需进行。 **RocketMQ 5.0 中的队列粒度负载均衡** 5.0 版本中引入了按消息粒度进行负载均衡的策略。 **主要特征:** - 消费者按消息粒度分配到消息队列中。 - 每个消费者组内的消费者将按照消息粒度消费消息。 - 队列分配策略可以根据不同的分配算法进行设置。 **优点:** - 避免队列粒度负载均衡策略的缺点,如队列分配不均衡、消息重复处理等。 - 适用于流式处理场景,确保消息被平均分配给消费者。 - 对非对等消费者更友好,可以处理网络延迟和消费者资源规格不一致等问题。 **注意:** - 消费者获取消息后会进行锁机制,保证消息对其他消费者不可见。 - 每个消费者只能处理一个消息队列上的消息。

正文

消费者负载均衡,是指为消费组下的每个消费者分配订阅主题下的消费队列,分配了消费队列消费者就可以知道去消费哪个消费队列上面的消息,这里针对集群模式,因为广播模式,所有的消息队列可以被消费组下的每个消费者消费不涉及负载均衡,而集群模式一个消息队列同一时间只能分配给组内的一个消费者进行消费。

RocketMQ 5.0以前是按照队列粒度进行负载均衡的,5.0以后提供了按消息粒度进行负载均衡。

队列粒度负载均衡

对于4.x/3.x的版本,包括DefaultPushConsumer、DefaultPullConsumer、LitePullConsumer等,默认且仅能使用队列粒度负载均衡策略。
队列粒度负载均衡策略中,同一消费者组内的多个消费者将按照队列粒度消费消息,每个队列只能被其中一个消费者消费。

注:图片来自RocketMQ官方文档

队列粒度负载均衡是在每个消费者端进行的,并不是由某个节点统一进行负载均衡之后将分配结果通知到每个消费者。消费者增加或者减少会影响消息队列的分配,所以Broker需要感知消费者的上下线情况,消费者在启动时会向所有的Broker发送心跳包进行注册,通知Broker消费者上线,下线的时候也会向Broker发送取消注册的请求,Broker会维护消费者信息的注册信息,在消费者发生变更时会通知消费者进行负载均衡。

Rebalance过程

消费者在启动的时候,会立刻触发一次负载均衡,为消费者分配消息队列。为了保证消费者拿到的主题路由信息是最新的(topic下有几个消息队列、消息队列的分布信息等),消费者会向NameServer发送请求,更新每一个主题的路由信息,保证路由信息是最新的。

  1. 根据Topic获取该Topic下的所有消费队列(MessageQueue对象), 消费者在启动时已经向NameServer发送请求获取了最新Topic的路由信息,里面可以获取到Topic下的所有消费队列;

  2. 由于负载均衡是在每个消费者端进行的,负载均衡时还需要知道订阅该主题的消费者组下都有哪些消费者,这个数据可以通过Broker获取,通过向Broker发送请求,查找订阅了该主题的所有消费者的ID(消费者会向Broker注册,所以可以通过Broker查找订阅了某个Topic的消费者);

  3. 如果主题对应的消息队列集合和获取到的消费者ID都不为空,对消息队列集合和消费ID集合进行排序;

  4. 获取分配策略,根据具体的分配策略,为当前的消费者分配对应的消费队列,RocketMQ默认提供了以下几种分配策略:

    • AllocateMessageQueueAveragely:平均分配策略,根据消息队列的数量和消费者的个数计算每个消费者分配的队列个数。
    • AllocateMessageQueueAveragelyByCircle:平均轮询分配策略,将消息队列逐个分发给每个消费者。
    • AllocateMessageQueueConsistentHash:根据一致性 hash进行分配。
    • AllocateMessageQueueByConfig:根据配置,为每一个消费者配置固定的消息队列 。
    • AllocateMessageQueueByMachineRoom:分配指定机房下的消息队列给消费者。
    • AllocateMachineRoomNearby:优先分配给同机房的消费者。
  5. 根据最新分配的消息队列,更新当前消费者负责的消息处理队列;

    由于负载均衡之后,消费者负责的消息队列可能发生变化,所以这里需要更新当前消费者负责的消息队列,之后就可以拉取消息进行消费了。

Rebalance的触发时机

一、消费者启动时触发
消费者在启动时会进行一次负载均衡,为自己分配消息队列。

二、Broker发现消费组变更时触发
处于以下两种情况之一时会被判断为消费组发生了变化,需要进行负载均衡:

(1)某个消费组内有新的消费者向Broker进行了注册,比如某个消费组原来有两个消费者,现在新增了一个消费者,新增的消费者启动时会向Broker发送注册请求;

(2)消费组订阅的主题信息发生了变化,比如消费组新增订阅了某个主题或者取消某个主题的订阅,会被判断为主题订阅信息发生了变化;

被判定为变化之后,会触发变更事件,向该消费者下的所有消费者发送发送变更请求,通知组下每个消费者进行负载均衡。

三、Broker收到消费者下线时触发
如果有消费者向Broker发送UNREGISTER_CLIENT取消注册请求,并且开启了允许通知变更,会触发变更事件,变更事件同上,Broker会通知该消费者组下的所有消费者进行一次负载均衡。

四、消费者定时触发
消费者本身也会定时执行负载均衡,默认是20s执行一次;

负载均衡源码解析可参考:【RocketMQ】【源码】负载均衡源码分析

特点

缺点
(1)队列粒度负载均衡策略分配粒度较大,不够灵活;
(2)队列粒度负载均衡策略保证同一个队列仅被一个消费者处理,在消费者数量、队列数量发生变化时,可能会出现短暂的队列分配结果不一致,从而导致少量消息被重复处理。
(3)如果队列数量和消费者数量不均衡,可能会出现部分消费者空闲或者部分消费者分配到的消息队列过多的情况。

优点
在流式处理场景下有优势,能够保证同一队列的消息被相同的消费者处理,对于批量处理、聚合处理更友好。

消息粒度负载均衡

在RocketMQ 5.0之后,增加了消息粒度负载均衡策略,对于PushConsumer和SimpleConsumer类型的消费者,默认且仅使用消息粒度负载均衡策略。

消息粒度负载均衡策略中,同一消费组内的多个消费者将按照消息粒度平均分摊主题中的所有消息,即同一个队列中的消息,可被平均分配给组内多个消费者共同消费。

注:图片来自RocketMQ官方文档

消息粒度负载均衡策略保证同一个队列的消息可以被组内多个消费者共同处理,但是该策略使用的消息分配算法结果是随机的,不能指定消息被哪一个特定的消费者处理。当消费者获取到某条消息后,服务端会对该消息加锁,保证该消息对其他消费者不可见,直到消息消费成功或者超时,所以多个消费者同时消费同一个消息队列中的消息,服务端也可以保证消息不会被多个消费者重复消费。

特点

(1)消费分摊均衡可以更均匀的分摊消息:不会像队列粒度负载均衡一样,出现分配不平衡的情况。
(2)对非对等消费者更友好:如果网络机房延迟、消费者物理资源规格不一致等原因,按照队列分配消息,可能出现部分消费者堆积、部分消费者空闲的情况,本质还是分摊更均匀。
(3)队列分配运维更方便:队列粒度负载均衡需要保证队列数量大于等于消费者数量,以免某些消费者获取不到队列出现空闲的情况,消息粒度负载均衡无需关注队列的数量。

消息粒度负载均衡策略适用于绝大多数在线处理的业务场景,对于流式处理、聚合计算等场景,更适合队列粒度的负载均衡策略。

参考
RocketMQ官方文档

与【RocketMQ】Rebalance负载均衡总结相似的内容:

【RocketMQ】Rebalance负载均衡总结

消费者负载均衡,是指为消费组下的每个消费者分配订阅主题下的消费队列,分配了消费队列消费者就可以知道去消费哪个消费队列上面的消息,这里针对集群模式,因为广播模式,所有的消息队列可以被消费组下的每个消费者消费不涉及负载均衡,而集群模式一个消息队列同一时间只能分配给组内的一个消费者进行消费。 Rocket

RocketMQ - 消费者Rebalance机制

客户端是通过Rebalance服务做到高可靠的。当发生Broker掉线、消费者实例掉线、Topic 扩容等各种突发情况时,消费者组中的消费者实例是怎么重平衡,以支持全部队列的正常消费的呢? RebalancePullImpl 和 RebalancePushImpl 两个重平衡实现类,分别被 Defa

记一次RocketMQ消费非顺序消息引起的线上事故

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工单创建完成的消息事件(异步消息)、MQ消费者收到消息之后、会通知各处理器处理该消息、各处理器处理完后都会发布一条将该工单写入搜索引擎的消息、最终该工单出现在搜索引擎、被工单处理人检索和处理。 事故异常体现 1、异常体现 从工单的流转记录发现、

【主流技术】聊一聊消息队列 RocketMQ 的基本结构与概念

RocketMQ 是阿里巴巴在 2012 年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于 2017 年 9 月 25 日成为 Apache 的顶级项目。 作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来...

RocketMQ 事件驱动:云时代的事件驱动有啥不同?

本文深入探讨了云时代 EDA 的新内涵及它在云时代再次流行的主要驱动力,包括技术驱动力和商业驱动力,随后重点介绍了 RocketMQ 5.0 推出的子产品 EventBridge,并通过几个云时代事件驱动的典型案例,进一步叙述了云时代事件驱动的常见场景和最佳实践。

RocketMq开启安全认证ACL-解决服务器系统安全漏洞

1、为什么要开启ACL 通过之前的文章我们已经知道怎么安装RocketMq了。如果你还不会安装RocketMq可以查看我的这篇文章:快速入门一篇搞定RocketMq-实现微服务实战落地 进行软件安装,附文章地址:https://www.cnblogs.com/sowler/p/18173752 。虽

如何实现一个简单易用的 RocketMQ SDK

2018 年,做为架构负责人,接到一个架构需求:实现一个简单易用的 RocketMQ SDK 。 因为各个团队 RocketMQ 原生客户端配置起来千奇百怪,有的配置存在风险,各团队负责人都需要一个简洁易用的 RocketMQ SDK 。 我立马调研相关开源的方案,当时 RocketMQ-Sprin

RocketMQ 之 IoT 消息解析:物联网需要什么样的消息技术?

前言: 从初代开源消息队列崛起,到 PC 互联网、移动互联网爆发式发展,再到如今 IoT、云计算、云原生引领了新的技术趋势,消息中间件的发展已经走过了 30 多个年头。 目前,消息中间件在国内许多行业的关键应用中扮演着至关重要的角色。随着数字化转型的深入,客户在使用消息技术的过程中往往同时涉及交叉场

[转帖]RocketMQ - nameSrv和Broker

RocketMQ RocketMQ是一个统一的消息传递引擎,轻量级的数据处理平台。 Name Server Name Server充当路由消息的提供者,生产者(Producer)或消费者(Customer)可以通过Name Server查找各主题对应的Broker IP列表,多个Name Serve

RocketMQ - 生产者原理

https://rocketmq.apache.org/ Apache RocketMQ是一款开源的、分布式的消息投递与流数据平台。出生自阿里巴巴,在阿里巴巴内部经历了3个版本后,作为Apache 顶级开源项目之一直到现在。在GitHub上有10000+star、5000+fork、170+cont