RocketMQ如何通过消费位点管理消费进度 您所在的位置:网站首页 阿里云asr清空队列 RocketMQ如何通过消费位点管理消费进度

RocketMQ如何通过消费位点管理消费进度

2024-07-02 22:19| 来源: 网络整理| 查看: 265

背景信息

云消息队列 RocketMQ 版的生产者和消费者在进行消息收发时,必然会涉及以下场景,消息先生产后订阅或先订阅后生产。这两种场景下,消费者客户端启动后从哪里开始消费?如何标记已消费的消息?这些都是由云消息队列 RocketMQ 版的消费进度管理机制来定义的。

通过了解云消息队列 RocketMQ 版的消费进度管理机制,可以帮助您解答以下问题:

消费者启动后从哪里开始消费消息?

消费者每次消费成功后如何标记消息状态,确保下次不会再重复处理该消息?

某消息被指定消费者消费过一次后,如果业务出现异常需要做故障恢复,该消息能否被重新消费?

消费进度原理消息位点(Offset)

参考云消息队列 RocketMQ 版主题和队列的定义,消息是按到达服务端的先后顺序存储在指定主题的多个队列中,每条消息在队列中都有一个唯一的Long类型坐标,这个坐标被定义为消息位点。

任意一个消息队列在逻辑上都是无限存储,即消息位点会从0到Long.MAX无限增加。通过主题、队列和位点就可以定位任意一条消息的位置,具体关系如下图所示:消息位点

云消息队列 RocketMQ 版定义队列中最早一条消息的位点为最小消息位点(MinOffset);最新一条消息的位点为最大消息位点(MaxOffset)。虽然消息队列逻辑上是无限存储,但由于服务端物理节点的存储空间有限,云消息队列 RocketMQ 版会滚动删除队列中存储最早的消息。因此,消息的最小消费位点和最大消费位点会一直递增变化。消费位点更新

消费位点(ConsumerOffset)

云消息队列 RocketMQ 版领域模型为发布订阅模式,每个主题的队列都可以被多个消费者分组订阅。若某条消息被某个消费者消费后直接被删除,则其他订阅了该主题的消费者将无法消费该消息。

因此,云消息队列 RocketMQ 版通过消费位点管理消息的消费进度。每条消息被某个消费者消费完成后不会立即在队列中删除,云消息队列 RocketMQ 版会基于每个消费者分组维护一份消费记录,该记录指定消费者分组消费某一个队列时,消费过的最新一条消息的位点,即消费位点。

当消费者客户端离线,又再次重新上线时,会严格按照服务端保存的消费进度继续处理消息。如果服务端保存的历史位点信息已过期被删除,此时消费位点向前移动至服务端存储的最小位点。

说明

消费位点的保存和恢复是基于云消息队列 RocketMQ 版服务端的存储实现,和任何消费者无关。因此云消息队列 RocketMQ 版支持跨消费者的消费进度恢复。

队列中消息位点MinOffset、MaxOffset和每个消费者分组的消费位点ConsumerOffset的关系如下:消费进度

ConsumerOffset≤MaxOffset:

当消费速度和生产速度一致,且全部消息都处理完成时,最大消息位点和消费位点相同,即ConsumerOffset=MaxOffset。

当消费速度较慢小于生产速度时,队列中会有部分消息未消费,此时消费位点小于最大消息位点,即ConsumerOffset



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有