rocketmq 标签

rocketmq超时重试导致的重复消费问题处理 有更新!

  |   0 评论   |   271 浏览

公司各系统交互使用的是RockeMQ 3.x版本的消息中间件。RocketMQ是以consumer group + queue 为单位来管理消费进度的,以一个consumer offset 标记这个组在queue上的消费进度,依靠这个进度来判定从哪里开始消费,每次消费成功后,本地的消费进度会被更新,然后定时器(这个时间很短)去同步到broker,来持久化消费进度,但是每次记录消费进度,只会把一批消息中最小的offset值记为消费进度值,

这种机制会带来一个潜在的重复问题——由于消费进度只是记录了一个下标,就可能出现拉取了100条消息如 2101-2200的消息,后面99条都消费结束了,只有2101消费一直没有结束的情况,这种情况下,RocketMQ为了保证消息肯定被成功消费,消费进度只能维持在2101,直到2101也被消费结束了,本地的消费进度才能标记2200消费结束。