rocketMQ的consumer 源码分析 -消息拉取(4)

本文深入分析RocketMQ消费者在集群模式下的工作原理,重点探讨消息拉取流程。从消费者启动、消息队列分配、拉取请求、消息存储容器到拉取流程的各个阶段,揭示了消息不被重复消费、顺序消费及线程协作的实现机制。在消息拉取过程中,还讨论了拉取偏移量的合法性问题及其处理方式。
摘要由CSDN通过智能技术生成

概述

消息消费是以消费组为单位,消费组可以订阅多个主题。每个消费组有两种模式,1.广播模式,一条消息被集群内的所有消费者消费;2.集群模式,同一条消息只能被所有消费者消费一次。消息传递的方式有两种,推模式和拉模式。推模式是在拉模式上包了一层。

广播模式是比较简单,我们主要分析分析集群模式。同时选取拉模式的代码。

集群模式下首先想到的是下面几个问题

一个消费组有多个消费者线程,一个主题存在有多个消费队列,消费者之间如何做消息队列的负载?如何不被重复消费?如何支持顺序消费?线程是如何分工合作的?

消费者的启动流程

之前的书上都是讲MQPullConsumer相关,在新版本中其实现类已经不建议使用了,取而代之的是LitePullConsumer接口以及其实现类DefaultLitePullConsumer

消息消费的启动流程在,DefaultLitePullConsumerImpl的start方法中,请看代码中的解释

this.serviceState = ServiceState.START_FAILED;
this.checkConfig();
//集群模式
if (this.defaultLitePullConsumer.getMessageModel() == MessageModel.CLUSTERING) {
   
    this.defaultLitePullConsumer.changeInstanceNameToPID();
}
//注册consumer group
initMQClientFactory();
//设置负载均衡 所需的 consumer group信息,设置负载分配的策略
initRebalanceImpl();
//注册拉取消息的过滤器
initPullAPIWrapper();
//初始化消息消费的偏移量,广播模式从本地获取,集群模式从远程获取
initOffsetStore();
/**
1.获取namesrv
2.启动channel
3.启动各种定时任务,定时获取namesrv;定时更新路由信息;心跳保持;持久化消费者偏移量;线程池调整;
4.拉取消息线程启动
5.重新负载线程启动
6.初始化producer
*/
mQClientFactory.start();
//启动一个定时任务,监听message queue的变化
startScheduleTask();
this.serviceState = ServiceState.RUNNING;
operateAfterRunning();
break;

需要注意的一点就是启动的很多对象都是全局唯一的,使用了synchronized相关的语法,以及使用枚举类去做状态机的流转。

消息拉取

上文的启动流程中可以知道,负责拉取消息的一个独立的线程,PullMessageService 继承自ServiceThread,通过run方法可以知道其实现机制,具体代码如下。

    public void run() {
   
        log.info(this.getServiceName() + " service started");

        while (!this.isStopped()) {
   
            try {
   
                pullRequest pullRequest = this.pullRequestQueue.take();
                this.pullMessage(pullRequest);
            } catch (InterruptedException ignored) {
   
            } catch (Exception e
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值