聊聊RocketMQ Rebalance负载均衡触发机制浅析

【RocketMQ】Rebalance负载均衡机制详解 Rebalance负载均衡组件, 他负责相对均匀的给消费者分配需要拉取的队列信息。我们此时可能会有以下问题:一个Topic下可能会有很多逻辑队列,而消费者又有多个,这样不同的消费者到底消费哪个队列呢?如果消费者或者队列扩缩容,Topic下的队列又该分配给谁呢?这些时候负载均衡策略就有他的用武之地了。RocketMQ在处理上面的问题是统一处理的,也就是逻辑是一致的,它都是通过这个类来完成负载均衡的工作,看完本文我们就可以明白RocketMQ消费者负载均衡的核心逻辑。消费端的负载均衡是指。 阅读详情

想必你已经了解RocketMQ的设计哲学是,同一时刻同一个Queue只能被一个Consumer持有,
但同一个Consumer可以同时消费多个队列,为了订阅、消费模型的高效,Rocket总是希望将Queue分配的足够均匀,
日常使用时,Consumer的上下线,Queue的动态扩缩容,都可能会破坏分配均衡性,
故而Rocket提供了一套完整的Rebalance机制针对上述状况。

触发条件

 总结下来Rebalance一共三个触发条件,两个主动,一个被动。满足任意一个都会触发

 1.Consumer启动之时执行start方法主动执行负载均衡逻辑;
 2.定时任务触发;
 3.Broker下发通知告知Client需要进行负载均衡;

 今天重新翻阅代码的时候发现
 很巧合三个触发条件或多或少跟DefaultMQPushConsumerImpl.start()都有关系;

DefaultMQPushConsumerImpl.start()

DefaultMQPushConsumerImpl创建实例时,会初始化rebalanceImpl成员变量 private final RebalanceImpl rebalanceImpl = new RebalancePushImpl(this); 此时此刻这个rebalanceImpl对象没有一点作用,因为ta的关键成员属性尚且为null,下文中的start肩负起了赋值重任。
下面是摘录start()主要代码:

public synchronized void start() throws MQClientException {
    switch (this.serviceState) {
        case CREATE_JUST: 
            /* 检查配置 */
            this.checkConfig();
            /* 构建 Topic 订阅信息——SubscriptionData,并添加至 RebalanceImpl 的订阅信息中 */
            this.copySubscription();
            /* 初始化 MQClientInstance */
            this.mQClientFactory = MQClientManager.getInstance()
                .getOrCreateMQClientInstance(this.defaultMQPushConsumer, this.rpcHook);
           /**
            * 丰富 rebalanceImpl 对象属性,注意到了吗之前初始化的对象充血了
            * 之前产生的 rebalanceImpl 对象直到此刻才算真正意义上的初始化完成
            * rebalanceImpl就是负载均衡的相关实现
            */ 
            this.rebalanceImpl.setConsumerGroup(this.defaultMQPushConsumer.getConsumerGroup());
            this.rebalanceImpl.setMessageModel(this.defaultMQPushConsumer.getMessageModel());
            this.rebalanceImpl.setAllocateMessageQueueStrategy(this.defaultMQPushConsumer.getAllocateMessageQueueStrategy());
            this.rebalanceImpl.setmQClientFactory(this.mQClientFactory);

            /**
             * 向 MQClientInstance 注册消费者,并启动 MQClientInstance
             * 一个 JVM 中的所有消费者、生产者持有同一个 MQClientInstance,MQClientInstance 只会启动一次
             */
            boolean registerOK = mQClientFactory.registerConsumer(this.defaultMQPushConsumer.getConsumerGroup(), this);
            break;  
        case 
            ...;
        default:
            break;  
    }

    /* Consumer启动成功,立即向所有Broker发送心跳 */
    this.mQClientFactory.sendHeartbeatToAllBrokerWithLock();

    /*
     * 注意到了嘛,Consumer上线会立即触发一次负载均衡 
     * 但是这里并不是调用一下负载均衡的实现那么简单,这里其实是唤醒了相关服务线程
     * 下文笔者会着重介绍
     */
    this.mQClientFactory.rebalanceImmediately();
}

RebalanceImpl

见名知意,Consumer负载均衡相关的操作全部都委托给RebalanceImpl对象。 每一个Consumer的对象都持有一个RebalanceImpl实例,每个RebalanceImpl实例也只服务于一个Consumer。
二者是一个相互持有,循环引用的关系。
我们来看一下这个对象的关键成员属性:

RebalancePushImpl extends RebalanceImpl { 
    protected final ConcurrentMap<MessageQueue, ProcessQueue> processQueueTable = new ConcurrentHashMap<>(64);

    /* ConcurrentMap<topic, Set<MessageQueue>>, Topic与分给自己的MessageQueue信息 */
    protected final ConcurrentMap<String, Set<MessageQueue>> topicSubscribeInfoTable = new ConcurrentHashMap<>();

    /* ConcurrentMap<topic,  SubscriptionData>, Topic与订阅数据 */
    protected final ConcurrentMap<String, SubscriptionData> subscriptionInner = new ConcurrentHashMap<>();

    /* 负载算法的具体实现,究竟如何分配就是由这个总指挥决定的 */
    protected AllocateMessageQueueStrategy allocateMessageQueueStrategy;

    /* Consumer实例 */
    private final DefaultMQPushConsumerImpl defaultMQPushConsumerImpl;
}

其中有一个ProcessQueue对象尤为瞩目,因为我没做任何注释,如果你有阅读Rocket源码应该知道他是 Consumer消费Message过程中极其重要的一环,举足轻重,你可以认为ta是Client端的消息承载者。 因为跟负载时机关系不大所以此处不再赘述。
负责进行均衡负载的就是doRebalance(),实际上真正执行负载逻辑的是rebalanceByTopic();

RebalanceByTopic()

rebalanceByTopic()是负载均衡的最终落脚点,即系统中所有需要负载的调用最后都会走到这里来。
集群消费模式下的实现 摘录关键代码:

private void rebalanceByTopic(String topic, boolean isOrder) {
    /* 获取到该Topic下的所有队列 */
    Set<MessageQueue> mqSet = this.topicSubscribeInfoTable.get(topic);
    /* 获取该Topic下ConsumerGroup此消费组所有的消费者Id */
    List<String> cidAll = this.mQClientFactory.findConsumerIdList(topic, consumerGroup);
    if (mqSet != null && cidAll != null) {
        List<MessageQueue> mqAll = new ArrayList<>(mqSet);

        /* 这两个排序极其关键 */
        Collections.sort(mqAll);
        Collections.sort(cidAll);

        /* 负载均衡算法 */
        AllocateMessageQueueStrategy strategy = this.allocateMessageQueueStrategy;
        List<MessageQueue> allocateResult;
        /* 调用具体的算法实现进行队列分配 */
        allocateResult = strategy.allocate(
            this.consumerGroup,
            this.mQClientFactory.getClientId(),
            mqAll,
            cidAll
        );
    }
}

看似轻描淡写实则举足轻重的两句代码:
Collections.sort(mqAll);
Collections.sort(cidAll);
这两句代码意义在于该ConsumeGroup下的所有Consumer得到的队列顺序、消费者Id顺序都是一致的。在分配视图一致性得到保证的前提下,分配算法又是相同的,这样一来尽管各个Consumer在负载均衡的时候不进行任何信息交换,但是却可以互不干扰有条不紊的将队列均衡的分配完毕。
如何分配的具体细节在allocateMessageQueueStrategy中,RocketMQ也默认支持多种分配算法,比较简单,笔者不想赘述。
负载均衡的实现讲完了,那谁会调用ta,如何调用ta,在什么时机下会调用ta,一个个问题萦绕心头,分析上述问题之前我们总是绕不开RebalanceService对象。

RebalanceService

RocketMQ中有一类对象地位超然,特立独行,一个对象主宰一个领域,ta们往往只受操作系统的约束。 似乎操作系统也格外偏爱他们,因为会给他们分配时间片,直接调度他们的运行(其实原因很简单,后面会有答案)。 ta就是传说中的ServiceThread,江湖中人往往称呼ta们为服务线程。

public abstract class ServiceThread implements Runnable {
    protected boolean isDaemon = false;

    /* 这能不被钟爱吗,直接持有一个独立线程 */
    private Thread thread;

    /* 执行start的时候申请一个线程 */
    public void start() {
        /* 只允许申请一次 */
        if (!started.compareAndSet(false, true)) {
            return;
        }
        stopped = false;
        this.thread = new Thread(this, getServiceName());
        /* 设置为非守护线程 */
        this.thread.setDaemon(isDaemon);
        this.thread.start();
    }
}

ServiceThread家族兴旺,除了专门负责负载均衡的RebalanceService,还有一众兄弟姐妹:
FlushRealTimeService:异步刷盘服务线程
CommitRealTimeService:异步刷盘服务线程
GroupCommitService: 同步刷盘服务线程
......
每一个都是Rocket能够稳定运行的背后功臣,上述三个其实就是刷盘相关的服务线程。 (涉及的面太广,如果有人想看,我尝试分析一下)

有了上面的铺垫,RebalanceService应该很好理解了,单独持有一个线程进行负载均衡,当然ta也不是无休止的一直进行负载处理。

public class RebalanceService extends ServiceThread { 
    /* 负载均衡时间间隔,默认20s,支持配置 */
    private final static long waitInterval =Long.parseLong(
        System.getProperty("rocketmq.client.rebalance.waitInterval", "20000")
    );

    private final MQClientInstance mqClientFactory;

    public void run() {
        /* 只要该线程未终止就会一直执行 */
        while (!this.isStopped()) {
            /* 喜欢才会放肆,但爱是克制,休息20s */
            this.waitForRunning(waitInterval);
            /* 执行负载均衡 */
            this.mqClientFactory.doRebalance();
        }
    }
}

定时任务

理解了上面的RebalanceService,应该就理解了定时触发的逻辑,只需要定时唤醒服务线程即可
每个Java服务单点只会启动一个RebalanceService服务实例,同时也只会启动一个mqClientFactory实例  
单点内所有的Consumer实例都会共用该实例对象。
每次定时触发mqClientFactory.doRebalance()都会对该JVM下持有的所有Consumer进行负载均衡

/**
 * RebalanceService 线程默认每隔20s调用该方法
 * ⚠️:每个 Java 服务单点只会启动一个 MQClientInstance 实例,单点内所有的 Consumer 实例都会持有该实例对象
 * @see #registerConsumer Consumer 对象会将自己注册进 MQClientInstance
 * @see #consumerTable Consumer对象注册表
 *
 * ⚠️:一个 Java 服务单点只有一个 RebalanceService 服务线程
 * ⚠️:但每个 Consumer 实例都持有一个 RebalanceImpl 对象
 */
public void doRebalance() {
    for (Map.Entry<String, MQConsumerInner> entry : this.consumerTable.entrySet()) {
        MQConsumerInner impl = entry.getValue();
        if (impl != null) {
            try {
                impl.doRebalance();
            } catch (Throwable e) {
                log.error("doRebalance exception", e);
            }
        }
    }
}

主动触发

写这篇记录之时我还在思考,为什么刚刚那个定时任务不是交给JDK中的ScheduledExecutorService
事实上,RocketMQ中的很多定时任务也都是这么做的。

可是直到刚刚我才明白,因为RebalanceService支持主动唤醒,提前执行任务。

Consumer上线时候触发主动负载均衡就是因为唤醒了RebalanceService线程,
start()最后会调用rebalanceImmediately()
public void rebalanceImmediately() {
    this.rebalanceService.wakeup();
}


Broker通知

Broker下发通知指挥Consumer需要负载均衡则明显复杂很多,但万变不离其宗,无非是多几次Rpc调用而已,无非是网络传输了一遭而已。

每当DefaultMQPushConsumerImpl实例,调用start之后,总是会向Broker发送一个心跳
调用栈如下:
    DefaultMQPushConsumerImpl.start()
->  MQClientInstance.sendHeartbeatToAllBrokerWithLock()
->  MQClientInstance.sendHeartbeatToAllBroker()
->  MQClientAPIImpl.sendHearbeat()

Consumer启动之后会立即发出一个心跳包告知Broker。

public int sendHearbeat(
        String addr, HeartbeatData heartbeatData, long timeoutMillis
    ) throws RemotingException, MQBrokerException, InterruptedException {
        /* 又是一次 Rpc 远程调用 */
        RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.HEART_BEAT, null);
        request.setLanguage(clientConfig.getLanguage());
        request.setBody(heartbeatData.encode());
        RemotingCommand response = this.remotingClient.invokeSync(
            addr, request, timeoutMillis
        );
    }

根据RequestCode.HEART_BEAT得知此次Rpc的处理器为ClientManageProcessor ClientManageProcessor.heartBeat() -> ConsumerManager.registerConsumer()

仅摘录关键代码:

public boolean registerConsumer(String group, ClientChannelInfo clientChannelInfo,
    ConsumeType consumeType, MessageModel messageModel, ConsumeFromWhere consumeFromWhere,
    Set<SubscriptionData> subList, boolean isNotifyConsumerIdsChangedEnable
) {
   /* 有新的Consumer上线则有新的SocketChannel建立 */
   boolean r1 = consumerGroupInfo.updateChannel(
       clientChannelInfo, consumeType, messageModel, consumeFromWhere
   );

   /* 判断订阅信息是否发生变化 */
   boolean r2 = consumerGroupInfo.updateSubscription(subList);

   if (r1 || r2) {
       if (isNotifyConsumerIdsChangedEnable) {
           /* 触发ConsumerGroupEvent.CHANGE事件 */
           this.consumerIdsChangeListener.handle(ConsumerGroupEvent.CHANGE, group, consumerGroupInfo.getAllChannel());
       }
   } 
}

调用进行到DefaultConsumerIdsChangeListener.handle()
可以看到如果是CHANGE事件则调用Broker2Client.notifyConsumerIdsChanged()

public void notifyConsumerIdsChanged(Channel channel, String consumerGroup) {
    /* 构造Rpc请求头 */
    NotifyConsumerIdsChangedRequestHeader requestHeader = new NotifyConsumerIdsChangedRequestHeader();
    requestHeader.setConsumerGroup(consumerGroup);
    /* 构造Rpc请求对象 */
    RemotingCommand request = RemotingCommand.createRequestCommand(
        RequestCode.NOTIFY_CONSUMER_IDS_CHANGED, requestHeader
    );

    /* 又是一次RPC */
    this.brokerController.getRemotingServer().invokeOneway(channel, request, 10);
}

这个Rpc请求最终会交给ClientRemotingProcessor.notifyConsumerIdsChanged()处理

public RemotingCommand notifyConsumerIdsChanged(ChannelHandlerContext ctx,
    RemotingCommand request) {
    NotifyConsumerIdsChangedRequestHeader requestHeader =(NotifyConsumerIdsChangedRequestHeader) request
        .decodeCommandCustomHeader(NotifyConsumerIdsChangedRequestHeader.class);
    /* 调用负载均衡逻辑 */
    this.mqClientFactory.rebalanceImmediately();
}
RocketMQ你不得不了解的 Rebalance机制源码分析 这里我们详细介绍了client是如何触发Rebalance的,以及触发Rebalance的时机,也介绍了Rebalance的好处。实际还有很多细节我们限于篇幅暂未分析。后面我们会继续分析Rebalance的坏处和一些详细的Rebalance算法。 阅读详情

相关推荐

RocketMQ的Rebalance详解

负载均衡 RocketMQ的消费负载是通过queue来对消息进行分片,然后consumer消费自己对应的queue来实现。我们以如下场景为例: topicA有两个队列:queue1和queue2。 消费组groupA有一台机器:consumer1 queue分配如下图所示,由于只有一台消费者机器,所以分布在queue1和queue2的消息都被consumer1消费掉。 如果这个时候开发人员收到消息积压告警,说明一个consumer已经无法及时处理所有消息了,对于这种情况通常会选择对消费集群进行扩容。于

qq_36031640的博客 3108

深入理解RocketMQ Rebalance机制

本文深入的分析了RocketMQ的Rebalance机制,主要包括以下内容: Rebalance必要的元数据信息的维护 Broker协调通知机制; 消费者/启动/运行时/停止时Rebalance触发时机 单个Topic的Rebalance流程 分区分配策略 RocketMQ与Kafka Rebalance机制的区别, 文章篇幅较长,感兴趣的用户可以先收藏,再阅读。 1 Rebalance简介 Rebalance(再均衡)机制...

meser88的博客 5042

数据采集系统设计实战:从架构选型到高可用部署

数据采集是构建数据驱动型业务的基石,它负责将分散、异构的原始数据转化为可供分析的结构化数据流。其核心原理在于通过Agent或Serverless等模式,从日志、数据库、API等多类数据源中实时或批量抽取数据,并借助消息队列进行缓冲与传输,确保数据的可靠性与顺序性。这一过程的技术价值在于为后续的数据存储、分析与应用提供了高质量、稳定的“数据原料”,是数据仓库、实时计算和业务智能系统得以高效运转的前提。在应用场景上,无论是用户行为分析、系统监控告警,还是物联网时序数据处理,都离不开一个健壮的采集系统。本文将聚焦

weixin_30402343的博客 340

记一次RocketMQConsumer 服务关闭出现InterruptException异常

记一次RocketMQConsumer 服务关闭出现InterruptException异常 背景提要 出现问题主要还是版本升级 老版本核心rocketmq依赖 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>spring-boot-starter-rocketmq</artifactId> <version>${vesion}&

不准动我的小老弟 3847

中间件:分布式系统的交通枢纽与核心组件实战解析

在分布式系统架构中,中间件作为连接应用与基础设施的关键组件,其核心价值在于解耦、复用与标准化。从原理上看,中间件通过提供标准接口和协议,将业务逻辑与底层技术细节分离,例如消息队列实现异步通信,缓存加速数据访问。其技术价值在于提升系统扩展性、可靠性和开发效率,是构建高可用、高性能系统的基石。应用场景广泛,涵盖服务通信、数据管理、系统协调等,例如API网关统一入口、Redis缓存热点数据、Nacos实现服务发现。本文聚焦于中间件的核心思想、主流组件(如Kafka、Redis)的深度解析,并结合部署配置与生产运维

chongyuwan4121的博客 486

中间件实战指南:从核心原理到Redis/Kafka深度应用

在分布式系统架构中,中间件作为连接操作系统与上层应用的关键软件层,其核心价值在于提供通用、可复用的服务能力,实现系统解耦与能力复用。从技术原理上看,中间件通过抽象底层复杂逻辑(如网络通信、并发处理),为应用开发提供统一接口,从而提升开发效率与系统可维护性。其技术价值体现在构建高可用、可扩展的系统架构,尤其在微服务、云原生等现代技术体系中不可或缺。典型应用场景包括异步通信、数据缓存、服务集成与分布式协调等。本文聚焦于中间件的核心分类与选型逻辑,并以Redis和Kafka为例,深入剖析其数据结构、持久化策略、高

weixin_33769125的博客 371

RocketMq 部分队列不能消费问题排查

欢迎移步到我个人博客网站阅读 RocketMq 部分队列不能消费问题排查

sharedCode源码交流 1万+

为什么在一段时间内RocketMQ的队列同时分配给了两个消费者?详细剖析消费者负载均衡中的坑...

消费者大概是怎么做负载均衡的(集群模式),如下图所示: 集群模式下,每个消费者实例会被分配到若干条队列。正因为消费者拿到了明确的队列,所以它们才能针对对应的队列做循环拉取消息的处理,以下是消费者客户端和broker通信的部分代码,可以看到通信的参数里有一个重要的参数,就是queueIdPullMessageRequestHeader requestHeader = new PullMess...

javadada1197的博客 2903

RocketMQ源码(十四)—消费者负载均衡服务RebalanceService入口源码

上一篇文章我们梳理了RocketMQ源码(十三)—消费者DefaultMQPushConsumer启动主要流程源码_代码---小白的博客-优快云博客RocketMQ一个消费者组可以有多个消费者,在集群模式下他们共同消费topic下的所有消息,RocketMQ规定一个消息队列仅能被一个消费者消费,但一个消费者可以同时消费多个消息队列。这就涉及到如何将多个消息队列分配给多个消费者的问题。RocketMQ中使用负载均衡服务RebalanceService来专门处理多个消息队列和消费者的对应关系,并且提供了多个不

djdjdxieuej的博客 650

无人自行车平衡控制:最小二乘法动态零点拟合实践

本文探讨了无人自行车平衡控制中动态零点的重要性及实现方法。通过最小二乘法拟合车头角度与ROL值的线性关系,解决了固定零点在转向时导致的稳定性问题。实践表明,动态零点拟合能显著提升系统平衡稳定性并降低能耗。

uran的专栏 660

揭秘Synopsys EDA中的AI黑科技:DSO.ai如何改变传统芯片设计流程

本文深入探讨了Synopsys EDA中的AI黑科技DSO.ai如何革新传统芯片设计流程。通过数据驱动的方法论、功耗优化革命和时序收敛智能加速,DSO.ai显著提升了设计效率和质量,实现了从经验驱动到AI驱动的范式转变。文章还提供了实战指南,帮助团队跨越AI EDA的实施鸿沟。

weixin_29296241的博客 523

RocketMQ的Reblance机制

RocketMQ的Rebalance机制是一种动态的消费者负载均衡策略,它确保了消息在消费者之间的均衡分配。这一机制特别重要,因为它允许系统在消费者数量变化时动态调整,优化资源利用率和提高消息消费的效率。

m0_54187478的博客 1391

手把手教你用示波器实测CAN总线波形:快速区分高速、低速及常见故障

本文详细介绍了如何使用示波器实测CAN总线波形,快速区分高速CAN总线和低速CAN总线,并诊断常见故障。通过实战案例和波形分析,帮助工程师掌握CAN总线信号特征,提升故障排查效率,适用于汽车电子和工业控制领域。

weixin_33217202的博客 409

浅析RocketMQ

文章目录前言一、特性二、高级特性1.高可用机制2.刷盘机制3.负载均衡3.1 producer3.2 consumer总结 前言 RocketMQ是阿里巴巴中间件团队自研的一款高性能、高吞吐量、低延迟、高可用、高可靠(具备金融级稳定性)的分布式消息中间件,开源后并于2016年捐赠给Apache社区孵化,目前已经成为了 Apache顶级项目。 一、特性 订阅与发布 消息顺序 消息过滤 消息可靠性 至少一次 回溯消费 事务消息 定时消息 消息重试 消息重投 流量控制 死信队列 二、高级特性 1.高可用机

weixin_54604802的博客 329

一文搞懂【Linux 搭建 Dread Hunger 服务器】附本体及Docker部署集群方案

看直播发现了五花八门的开服器和版本,一时兴起按官方文档进行了搭建尝试,所以我的版本基于官方Stream2024.01.10更新的版本,也就是停服时的玩法,应该可以根据mod和补丁魔改成更那些开服器一样的版本,本文不做谈论,注重服务器搭建,毕竟8个人不可能在一个局域网里乱象:首先,我看了大量教程视频,一类是开服器的推广,另一类自建的基本采用Windows搭建,我觉得最离谱的是大部分教程都会教你买一台远程Windows虚拟机???

LHmine的博客 3983

SAP后台JOB保姆级教程:从SM36创建到SM37监控,手把手教你搞定ABAP程序定时任务

本文详细解析SAP后台JOB从创建到监控的全流程,重点介绍SM36创建和SM37监控的操作步骤与最佳实践。通过真实案例演示如何配置定时任务、处理常见故障及实施企业级管理策略,帮助ABAP开发者高效管理后台程序执行。

weixin_30838873的博客 430

RocketMQ使用教程及部分原理分析两种监听模式以及消费失败处理策略

RocketMQ由producer、NameServer、broker、consumer组成 Producer: 为生产者,消息的来源。需要与NameServer建立连接,从NameServer获取Topic对应的Message Queue的broker地址 NameServer: 相当于一个路由器,存着broker的地址信息和对应的topic信息。NameServer可以横向扩展,broker和每一台NameServer建立长连接 Broker: Broker是RocketMQ的核心,提供了消息的接收,存

a374519711的博客 5185

最新 抖音 X-Gorgon 0408 和8408 设备注册协议

抖音app先是检测了你的手机cpu架构,是x86还是armeabi,通过cpu架构的不同来调用so内不同的xg方法,所以导致现在最新版抖音app的xg算法有0408和8408两种。两种都是最新版,因为我发现当我使用oppo手机安装最新版抖音抓包的xg是8408,而当我用小米或者华为安装最新版抖音,抓包以后发现xg是0408。抖音IOS XG84 设备注册激活协议代码片段。...

Q44804487的博客 1万+

RocketMQ的负载均衡

在了解了RocketMQ的发送与接收后,也好奇RocketMQ内部是如何处理好生产端、消费端的负载均衡的,下面通过分析源码、查阅相关文档资料以及结合自己的理解,做了下归纳总结。 RocketMQ的消息负载均衡都是下放到Client端来实现的,具体可细分为2块:发送负载(Producer端)、消费负载(Consumer端)。 1、发送负载 1.1 路由信息 消息生产者Producer作...

BuDongOrz的专栏 2365

【漏洞复现】CVE-2024-44902 Thinkphp反序列化漏洞

Thinkphp v6.1.3至v8.0.4版本中存在反序列化漏洞,攻击者可利用此漏洞执行任意代码。

渗透之路,攻防之间皆学问 6705

matlab 点云按高程进行赋色【2024最新版】

首先按照Z轴方向求取所在点云的高程极值(包括高程最大值与最小值),然后将高程归一化到0~255范围内,最后采用matlab中的colormap颜色渲染函数进行赋色并保存渲染结果到点云。

点云侠的博客 3341

RocketMQ5.0.0消息消费<二> _ 消息队列负载均衡机制

本章介绍了消费者负载均衡,给消费者分配消费队列。消费者启动后,会启动MQClientInstance实例,从而启动负载均衡线程,每20s周期执行重新分配,进而对分配的消费队列是否变化进行消费进度修改,重新拉取消息。同时也介绍了不同的负载均衡策略。

爱我所爱0505 1197

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

RocketMQ源码:consumer 负载均衡(重平衡)

Rebalance(重平衡)机制指的是:将一个Topic下的多个队列,在同一个消费者组()下的多个消费者实例()之间进行重新分配。Rebalance机制的本意是为了提升消息的并行消费能力。例如,⼀个Topic下5个队列,在只有1个消费者的情况下,这个消费者将负责消费这5个队列的消息。如果此时我们增加⼀个消费者,那么就可以给其中⼀个消费者分配2个队列,给另⼀个分配3个队列,从而提升消息的并行消费能力。由于⼀个队列最多分配给消费者组下的⼀个消费者,因此当某个消费者组下的消费者实例数量大于队列的数量。

Java技术攻略的博客 800

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RocketMQ生产者和消费者的负载均衡分配策略

负载均衡分两块儿,一个是producer的负载均衡,一个是Comsumer的负载均衡 Producer负载均衡 Producer发送消息时,默认会轮询目标Topic下的所有MessageQueue,并采用递增取模的方式往不同的MessageQueue上发送消息,以达到让消息平均落在不同的queue上的目的。而由于MessageQueue是分布在不同的Broker上的,所以消息也会发送到不同的broker上。 同时生产者在发送消息时,可以指定一个MessageQueueSelector。通过这个对象来

张俊杰 的博客 4207

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【RocketMq消费者Rebalance总结-3】

Rebalance机制,即再均衡机制,是RocketMQ中一个重要的功能。当一个Topic下的多个队列(或称之为分区)需要在同一个消费者组下的多个消费者实例之间进行重新分配时,就会触发Rebalance机制。该机制的本意是为了提升消息的并行处理能力。举例来说,如果一个Topic下有5个队列,在只有1个消费者的情况下,那么这个消费者将负责处理这5个队列的消息。如果此时我们增加一个消费者,那么可以通过Rebalance机制,给其中一个消费者分配2个队列,给另一个分配3个队列,从而提升消息的并行处理能力。

weixin_47068446的博客 1254
上一篇: Java对象初始化过程代码块与构造器调用顺序
下一篇: RocketMQ中的消息存储结构及删除机制
Java_ttcd
博客等级 码龄4年 198粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值