rocketmq源码-consumer已消费offset更新逻辑

本文详细探讨了RocketMQ中消费者消费offset的更新逻辑,包括消费者如何将offset存储到内存,通过定时任务发送更新请求到Broker,Broker如何处理这些请求并同步到内存及磁盘。着重讲解了offset在内存和磁盘间的同步过程。

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

前言

这篇博客,主要记录consumer已经消费的offset是如何更新的

对于集群模式,offset是维护在broker中的;而广播模式,offset是存储在本地文件中(暂时没有验证具体存储的位置,是根据源码推测的)

不管是pull模式,还是push模式,都需要维护consumer当前已经消费的offset
更新offset的逻辑,大致是这样的:
1.client从broker拉取消息
2.然后client回调业务系统的消费者所注册的messageListener,对消息进行处理
3.在处理完消息之后,会先将offset更新到client的内存中,需要注意的是:我这里说的client,并不是业务系统的消费者,而是rocketmq框架中的consumer
4.consumer在启动的时候,会启动一个异步线程,去定时的获取consumer内存中每个messageQueue的offset,然后通过发送netty请求到broker去处理
5.broker在接收到客户端的更新offset的请求之后,会把client发送过来的offset,更新到内存中,在内存中,也是通过一个map集合来存储
6.broker在启动的时候,也会启动一个异步定时的线程,定时的去拉取内存中的offset数据,然后持久化到磁盘文件上,consumerOffset.json

这上面的第一步,第二步是拉取消息的逻辑,在前面的博客中,也有介绍过,这里就不做过多的介绍

client更新offset到内存中

这是上面第三点的逻辑

org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService.ConsumeRequest#run

这个run方法,是将拉取到的消息,解析之后,依次回调业务系统中的消费者所注册的messageListener方法

在这里插入图片描述

在回调完之后,会接着进行其他逻辑的处理,其中,有一步很重要的操作:

RocketMQ的PushConsumer是一种消息消费者模式,它是基于拉取模型的实现。尽管消息消费被称为Push,但实际上仍然是通过拉取的方式来获取消息。\[1\]在RocketMQ中,消费者有两种模式,一种是push模式,另一种是pull模式。在push模式中,当服务端有消息时,将消息推送到客户端。而在pull模式中,客户端需要不断轮询请求服务端来获取新的消息。\[3\]不过,无论是push模式还是pull模式,实际上都是采用消费端主动拉取的方式,即consumer轮询从broker拉取消息。\[3\]在PushConsumer中,轮询过程被封装在内部,并通过注册MessageListener监听器来消费消息。当消息到达时,会唤醒MessageListener的consumeMessage()方法来进行消费,给用户一种消息被推送过来的感觉。\[3\]而在PullConsumer中,用户需要自己编写获取消息逻辑,首先通过打算消费的Topic获取MessageQueue的集合,然后遍历MessageQueue集合,针对每个MessageQueue批量获取消息,一次取完后记录该队列下一次要取的开始offset,直到取完了再切换到另一个MessageQueue。\[3\]所以,PushConsumerRocketMQ中用于实现push模式消息消费的一种消费者。 #### 引用[.reference_title] - *1* [RocketMQ实战-初探PushConsumer限流机制实现原理](https://blog.youkuaiyun.com/Huangjiazhen711/article/details/127746551)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [rocketmq源码-consumer拉取消息(push模式)](https://blog.youkuaiyun.com/CPLASF_/article/details/128311025)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [rocketMQconsumer的push和pull模式](https://blog.youkuaiyun.com/qq_26896085/article/details/104958768)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值