rocketMq - 并发消费过程

本文详细介绍了RocketMQ中并发消费的实现原理,包括消息拉取、重试机制、消费进度的持久化等关键环节,并解释了如何通过核心组件如Rebalance、PullMessageService等来保证消费效率与可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

rocketMq消费过程包括两种,分别是并发消费和有序消费,每个消费方式都可以单独拿出来进行分享,这篇文章单独用来分析并发消费问题。

并发消费需要理解的几个核心点:并发消费的消息拉取,并发消费的消息重试,并发消息的ack机制,消费进度的持久化,这篇分享会就这几个问题分解展开。

其他逻辑

    1、consumer会定期向broker同步ack消息偏移量,也就是已经消费的位置。

    2、极端情况下consumer会因为一个消息一直失败导致ack消息偏移量无法前进,但是因为会有定时任务去清楚过期消息,所以ack进度正常便宜。

并发消费整体流程


img_e42b201eec0d4110aa1d143b9cc41d57.png
并发消费过程

说明:

    1、Rebalance负责生成pullRequest放置到pullRequestQueue当中。

    2、PullMessageService负责消费pullRequest来完成数据的拉取。

    3、数据拉取后生成ConsumeRequest对象投递到consumeExecutor的线程池当中

    4、ConsumeRequest是一个线程实例,负责消费拉取的消息。

    5、消费消息成功就从ConsumeRequest的ProcessQueue中删除,消费失败就投递到broker的重试队列中,重试次数和延迟粒度在broker端处理。

    6、consumeRequest内部维持的processQueue作为一个TreeMap对象可以维持消息的有序性,用于判断消费进度。

    7、pullRequest在消费完以后还是再次投递到pullRequestQueue当中。


pullRequest执行过程

img_560ef18c51c66cc839a19629abc8037e.png
consumer消费入口

说明:参见PullMessageService类

    1、单线程循环消费pullRequest。


img_4a31898b068227407da9775a52aa329b.png
消费流速控制

说明:参见PullMessageService类

    1、消费过程中进行一些状态判断以及流速控制


img_545f763656fced7cb5bb1dc98d61376d.png
有序消费和无须消费处理逻辑

说明:参见DefaultMQPushConsumerImpl类

    1、区分有序消费和无须消费

    2、无序消费会判断消费偏移量是否差别过大


img_5468c88753eafbbd9cbed0b6d0964f2b.png
拉取消息的回调函数

说明:参见DefaultMQPushConsumerImpl类

    1、处理拉取消息的后续操作

    2、处理完以后再次投递pullRequest请求


img_f639317df1c327af445dc0e2dc270d47.png
消息拉取执行部分

说明:参见PullAPIWrapper类


img_4cb41a297b1753b9ec3e8a79484f3817.png
真正执行拉取的地方

说明:参见PullAPIWrapper类


img_693f104adadfb1fb65b10e22bb032b66.png
处理拉取的消息结果

说明:参见ConsumeMessageConcurrentlyService类。

    1、拉取消息成功后设置下一次拉取的偏移量。

    2、更新拉取的消息到processQueue当中。

    3、再次投递pullRequest发起下一次拉取。


img_0d89fbb795e34cb622fd3a019590cdaa.png
处理拉取消息的分配处理

说明:参见ConsumeMessageConcurrentlyService类

    1、分一次能够处理完成和分多次能够处理完成。


img_ddafe2724d7a12b24de4ea306cb4bbd5.png
consumer消费对象的核心

说明:

    1、processQueue是待处理消息保存位置,里面核心数据结构之一为TreeMap

    2、messageQueue就是这个ConsumeRequest负责处理的messageQueue


img_bb99831e3b2de4ae7d1c92116661c17d.png
回调函数消费并进行结果处理

说明:参见ConsumeMessageConcurrentlyService类

    1、consumer消费拉取消息的逻辑及后续处理


img_bcf2d78875ac7d09f017667b344a5dab.png
持久化消费位移

说明:参见ConsumeMessageConcurrentlyService类

    1、消费成功就删除所有拉取的消息


img_6e8b8775104891ca759270533bd5883c.png
broker端存储重试消息

说明:参见SendMessageProcessor类

    1、处理逻辑在consumerSendMsgBack方法中

    2、里面涉及到延迟粒度和重试次数的设置

    3、消息是被投递到延迟队列当中的


img_428bbcdfa7fb86576a7f01e4bde68770.png
定期持久化消费位移

说明:参见MQClientInstance类

    1、在persistAllConsumerOffset定期持久化消费偏移量

    2、消费偏移量由ConsumerRequest请求在处理的过程中变更的


img_64270fa0f4b301ff94a2ad621c2f35be.png
重新发送拉取请求

说明:参见DefaultMQPushConsumerImpl类

    1、处理没有从broker拉取消息的过程

    2、再次投递pullRequest请求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值