从入门到入土(八)RocketMQ的Consumer是如何做的负载均衡的

本文详细剖析了RocketMQ Consumer的负载均衡实现,通过RebalancePushImpl、RebalanceImpl类及其实现策略如AllocateMessageQueueAveragely,讨论了Consumer数量与Queue数量不匹配时的情况,并介绍了不同负载均衡算法,最后揭示了Consumer启动时的Rebalance过程及其时效性。
摘要由CSDN通过智能技术生成

从入门到入土(八)RocketMQ的Consumer是如何做的负载均衡的

一、问题描述

面试官:RocketMQ的Consumer是如何做的负载均衡?比如:5个Consumer进程同时消费一个Topic,这个Topic只有4个queue会出现啥情况?反之Consumer数量小于queue的数据是啥情况?

应聘者:一脸懵逼。

二、源码剖析

1、RebalancePushImpl
public class RebalancePushImpl extends RebalanceImpl {
public RebalancePushImpl(String consumerGroup, MessageModel messageModel,
AllocateMessageQueueStrategy allocateMessageQueueStrategy,
MQClientInstance mQClientFactory, DefaultMQPushConsumerImpl defaultMQPushConsumerImpl) {
// 可以看到很简单,调用了父类RebalanceImpl的构造器
super(consumerGroup, messageModel, allocateMessageQueueStrategy, mQClientFactory);
this.defaultMQPushConsumerImpl = defaultMQPushConsumerImpl;
}

2、RebalanceImpl
public abstract class RebalanceImpl {
// 很简单,就是初始化一些东西,关键在于下面的doRebalance
public RebalanceImpl(String consumerGroup, MessageModel messageModel,
AllocateMessageQueueStrategy allocateMessageQueueStrategy,
MQClientInstance mQClientFactory) {
this.consumerGroup = consumerGroup;
this.messageModel = messageModel;
this.allocateMessageQueueStrategy = allocateMessageQueueStrategy;
this.mQClientFactory = mQClientFactory;
}

/**
 * 分配消息队列,命名抄袭spring,doXXX开始真正的业务逻辑
 *
 * @param isOrder:是否是顺序消息 true:是;false:不是
 */
public void doRebalance(final boolean isOrder) {
    // 分配每个topic的消息队列
    Map<String, SubscriptionData> subTable = this.getSubscriptionInner();
    if (subTable != null) {
        for (final Map.Entry<String, SubscriptionData> entry : subTable.entrySet()) {
            final String topic = entry.getKey();
            try {
                // 这个是关键了
                this.rebalanceByTopic(topic, isOrder);
            } catch (Throwable e) {
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值