1.前言
此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂《从0开始带你成为RocketMQ高手》,我本人觉得这个作者还是不错,都是从场景来进行分析,感觉还是挺适合我这种小白的。这块主要都是我自己的学习笔记。想看原版的,还是去儒猿课堂。
这篇文章紧挨着上一篇文章:Broker收到消息之后如何存储-CSDN博客
2.Consumer的启动
我们一般都是通过DefaultMQPushConsumer的start方法来进行启动Consumer,我们现在看下这个启动的时候都会做什么事情,
首先会先通过Netty跟Broker进行创建连接,我们就会看下下面的代码
this.mQClientFactory = MQClientManager.getInstance().getOrCreateMQClientInstance(this.defaultMQPushConsumer, this.rpcHook);
紧接着我们看到了RebalanceImpl,往这个RebalanceImpl中进行设置了ConsumerGroup,MessageModel等信息。这个看名字就知道这个是用来进行ConsumerGroup的平衡的。这个平衡的意思:当ConsumerGroup中出现Consumer宕机或者别的情况的时候,需要MessageQueue的一个重新分配的意思。
this.rebalanceImpl.setConsumerGroup(this.defaultMQPushConsumer.getConsumerGroup());
this.rebalanceImpl.setMessageModel(this.defaultMQPushConsumer.getMessageModel());
this.rebalanceImpl.setAllocateMessageQueueStrategy(this.defaultMQPushConsumer.getAllocateMessageQueueStrategy());
this.rebalanceImpl.setmQClientFactory(this.mQClientFactory);
我们紧接着往下看,我们会看到一个PullAPIWrapper,这个PullAPIWrapper看名字是专门用来拉取消息的API组件信息。
this.pullAPIWrapper = new PullAPIWrapper( mQClientFactory,
this.defaultMQPushConsumer.getConsumerGroup(), isUnitMode());
this.pullAPIWrapper.registerFilterMessageHook(filterMessageHookList);
接着往下看,我们紧着发现了OffsetStore,这个offsetStore就是用来进行存储消息消费offset到什么位置。
if (this.defaultMQPushConsumer.getOffsetStore() != null) {
this.offsetStore = this.defaultMQPushConsumer.getOffsetStore();
} else {
switch (this.defaultMQPushConsumer.getMessageModel()) {
case BROADCASTING:
this.offsetStore = new LocalFileOffsetStore(this.mQClientFactory, this.defaultMQPushConsumer.getConsumerGroup());
break;
case CLUSTERING:
this.offsetStore = new RemoteBrokerOffsetStore(this.mQClientFactory, this.defaultMQPushConsumer.getConsumerGroup());
break;
default:
break;
}
this.defaultMQPushConsumer.setOffsetStore(this.offsetStore);
}
this.offsetStore.load();
看到这里我们画张图片来看下
3.Consumer如何分配消费队列
咱们在代码开发中,基本上每个系统都会有一个Consumer,多个Consumer会组成一个ConsumerGroup,假如一个Topic有3个MessageQueue,但是Consumer只有两个的话,这种情况就会使用前面所说的RebalanceImpl进行分配。实际上在所有的Consumer启动的时候,都会向所有的Broker进行注册并维持心跳。每个Consumer启动之后,重平衡组件(RebalanceImpl)就会随机选择一个Broker,从里面进行获取有哪些Consumer存在,一旦知道了有哪些Consumer的存在就会将MeesageQueue均匀的分给这些Consumer。一旦MessageQueue确定了,剩下的就是Consumer去找到对应的Broker,不断的从Broker中进行拉取消息进行消费就可以了。