前言
这篇博客,主要记录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方法
在回调完之后,会接着进行其他逻辑的处理,其中,有一步很重要的操作: