rocketmq cluster下concurrently重试机制实现

总体来说比较迂回,比较巧妙地利用了原顺序存储机制和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属性转移了.


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值