rocketmq cluster下concurrently重试机制实现

本文详细解析了RocketMQ消息中间件中重试机制的工作原理。包括如何通过Consumer返回特定状态来触发消息重试,消息从原Topic转移到重试Topic的过程,以及如何利用延迟队列确保消息能够被正确且及时地重试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总体来说比较迂回,比较巧妙地利用了原顺序存储机制和delay队列机制.

重试消息的consumer发回:

      ConsumeMessageConcurrentlyService.java 里     processConsumeResult(ConsumeConcurrentlyStatus, ConsumeConcurrentlyContext, ConsumeRequest){  

       当失败时设置idx=-1. 发回broker, 如果发送失败. 几分钟后重试.

  

重试消息的存储:

1.原topic消费

2.消费失败,发回到broker

3.broker 替换为retry,

4. 进一步改成delay_topic 和对应的queue中 ,放入到commitlog后分发. (新的实体,这样commitLog就可往前走了,不用担心数据超过4G删除)

重试消息的消费:

5. 有broker本地delay消息的模拟消费者消费,并将其放入到retryTopic和队列中.

6. 消费者订阅了按组划分的retryTopic, 获取消息并消费.


代码写的不好的一个点:

 delayLevel客户端设置为0, 服务端会增加3,并放到message的properties中. 最终转移给新的message.

用了getDelay,但是没有用setDelay, 通过properties整体将delay属性转移了.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值