RocketMQ 5.1.0 消费端 源码分析

书接上文,当消息存储到文件后,并没有看到他与消费者有相关操作?那么消费者改如何获取呢?

image.png

在前文中讲述了文件落盘,在log中还包含一个提交服务。CommitRealTimeService,用于将已经落盘的数据进行提交到分配索引中(pos)。也即当我们落盘后需要经过CommitRealTimeService才能继续处理。


image.png

image.png

image.png

如果是主从。


image.png

提交如下:
image.png

至此提交完成,writeBuffer是否存在来判断是否直接以WROTE_POSITION_UPDATER作为pos,否则以COMMITTED_POSITION_UPDATER为pos。此处大量篇幅讲述pos主要在于后面派发时会使用到。
image.png

此服务非常重要,用于消息的派发。
image.png

image.png

image.png

image.png

image.png

image.png

image.png

存在三个派发器,此处以CommitLogDispatcherBuildConsumeQueue进行讲解,该派发器用于处理消息到消费队列的过程。


image.png

image.png

image.png

还是比较简单的,就是从map中获取。
image.png

当然再启动是也会从文件中加载该map。
image.png

image.png

至此后续所有操作都将进入消费队列consumeQueue对象。
image.png

image.png

image.png

至此将消息加入到消费队列中。
消息消费在mq中存在两种模式1、消费端维护pos通过pull获取消息 2.pop弹出最新消息两种模式。

第一种 PullMessageProcessor

image.png

image.png

image.png

image.png

image.png

至此消息已经获取完成。还需要讲解得是,当获取完消息后需要记录消费偏移,为Pop模式做记录,pull模式由用户维护偏移,而pop模式则由服务端做记录。


image.png

image.png

image.png

至此更新到map中。目前看他是通过内存进行记录的,实际它存在对应的文件。
image.png

每十秒存储一次。


image.png

写入文件。
image.png

提供offset存储文件位置。

第二种 PopMessageProcessor

image.png

image.png

image.png

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容