消息中间件之RocketMQ源码分析(五)

消费进度保存机制

消费者启动时会同时启动位点管理器,RocketMQ设计了远程位点管理和本地位点管理
两种位点管理方式.
集群消费时,位点由客户端提交给Broker保存.
广播消费时,位点保存在消费者本地磁盘上

消息中间件之RocketMQ源码分析(五)_第1张图片

OffsetStore接口核心方法

消息中间件之RocketMQ源码分析(五)_第2张图片

  • void load():加载位点信息
  • void updateOffset():更新缓存位点信息
  • long readOffset():读取本地位点信息
  • void persistAll():持久化全部队列的位点信息
  • void persist():持久化某一个队列的位点信息
  • void remove():删除某一个队列的位点信息
  • Map cloneOffsetTable():复制一份缓存位点信息
  • void updateConsumeOffsetToBroker():将本地消费位点持久化到Broker中

客户端消费进度保存也叫消费进度持久化,RocketMQ4.2.0支持定时持久化和不定时持久化两种方式

  • 定时持久化位点org.apache.rocketmq.client.impl.factory.MQClientInstance#startScheduledTask,
    定时持久化位点逻辑是通过定时任务来实现的,在启动程序10s后,会定时调用持久化方法,MQClientInstance.this.persistAllConsumerOffset(),持久化每一个消费者消费的每一个MessageQueue的进度
    消息中间件之RocketMQ源码分析(五)_第3张图片

  • 不定时持久化也叫Pull-And-Commit,也就是在执行Pull方法同时,把队列最新消费位点信息发给Broker,
    org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl#pullMessage(),该方法有两处持久化位点消息
    1.在拉取完成后,如果拉取位点非法,则此时客户端会主动提交一次最新的消费位点信息给Broker,以便下次能使用正确的位点拉取消息
    消息中间件之RocketMQ源码分析(五)_第4张图片
    2.在执行消息拉取动作时,如果是集群消费,并且本地位点值大于0,那么把最新的位点上传给Broker,代码中通过commitOffsetEnable、sysFlag两个字段表示是否可以上报消费位点给Broker,在执行Pull请求时,将sysFlag作为网络请求的消息头传递给Broker,Broker中处理该字段的逻辑在
    消息中间件之RocketMQ源码分析(五)_第5张图片
    消息中间件之RocketMQ源码分析(五)_第6张图片
    消息中间件之RocketMQ源码分析(五)_第7张图片
    以上Broker处理代码中有3个核心变量.
    hasCommitOffsetFlag:Pull请求中的sysFlag参数是决定Broker是否执行持久化消费位点的一个因素.brokerAllowSuspend:Broker是否能挂起。如果Broker是挂起状态,将不能持久化位点。storeOffsetEnable:true表示Broker需要持久化消费位点,false则不用持久化位点

3.还有一种持久化位点的机制,那就是消费者在关闭时持久化位点信息,
以Push消费者程序关闭为例,org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl#shutdown(long)
消息中间件之RocketMQ源码分析(五)_第8张图片
实现过程是从Rebalance服务中获取全部消费的队列信息,再调用persistAll()方法持久化全部队列的位点信息
消息中间件之RocketMQ源码分析(五)_第9张图片

你可能感兴趣的:(消息中间件,java-rocketmq,rocketmq,java)