rockemq 发送延迟消息_RocketMQ消费失败消息处理

本文介绍了RocketMQ在Push模式下处理消费失败的消息逻辑。消费失败的消息会被回发到Broker的%RETRY%XX主题,并在回发失败时在本地启动任务重试,以防止消息丢失。通过维护消费offset,即使consumer或broker故障,也能保证消息最终被消费。此外,讨论了RocketMQ为何采取这种方式,以及其在并发消费、拉取策略和保证不丢数据方面的设计。
摘要由CSDN通过智能技术生成

闲着研究了下RocketMQ消费失败消息的处理逻辑这里记录下,更细化说这里只讨论Push模式(其实实现还是Pull的模式)非顺序消费的情况Pull和顺序消息这里暂时不做讨论哈~(还没研究- -)

消费失败处理逻辑

消费成功的情况RockeMQ会通过移动消费offset位点向前来标示消息已被处理

而对于业务处里失败的消息采用的策略是将消息回发回Broker(并存放到一个%RETRY%XX的topic中), 大家一听可以想到的是回发broker这时候broker挂了怎么办?

回发失败的时候会在本机启动个task来重试..恩 然后这时候consumer机器挂了了怎么办重试没了,难道丢消息?

所以为了保证consumer掉电不丢消费失败且回发失败的消息,代码里保证offsetManage(local or remote)中offset不会前移超过重发失败消息的offset,这样可以保证在下次需要,如果下次consumer活过来时(这时一定会从offsetManage中取offset, 恩其实正常运行中不会每次都取, 顺序消息除外...),一定可以重拉到消费失败的消息(后面会提到这个的代价是会重复拉到很多上次已经消费的消息,不过业务同学的代码都是幂等的,所以逃~)

对于消费失败但回发成功的消息,会直接更新offset假装认为那几条消息已经被消费成功,因为他们已经转生在%RETRY%XX topic里作为新消息等待消费了~当前消费者可以专注于干其他事情.(补充: RERTRY topic实际会带上delay所以实际是先SCHEDULE_TOPIC然后再%RETRY%XX, 这个具体见其他同学关于delay消息的解析~)

可以看到,重发这种模式是不会丢消息的,即使broker挂了,consumer挂了,一定会消费到,虽然可能获得很多不想要的重复消息- -

为啥这么搞

写本文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值