消息失败重试

一、消息发送端失败,重试

producer在发送消息的时候如果发送失败了,RocketMQ会自动重试。

1.重试几次?

  • 同步发送:org.apache.rocketmq.client.producer.DefaultMQProducer#retryTimesWhenSendFailed + 1,默认retryTimesWhenSendFailed是2,所以除了正常调用一次外,发送消息如果失败了会重试2次
  • 异步发送:不会重试(调用总次数等于1)

2.什么时候重试?

发生异常的时候,需要注意的是发送的时候并不是catch所有的异常,只有内部异常才会catch住并重试。

3.怎么重试?

每次重试都会重新进行负载均衡(会考虑发送失败的因素),重新选择MessageQueue,这样增大发送消息成功的可能性。

4.隔多久重试?

立即重试,中间没有单独的间隔时间

二、消息消费端失败,重试

消费端重试过程:

  • 消费超时/消费过程抛出异常,消息认为消费失败,将会发起重试。
  • 在指定时间间隔,在重试规定次数内,逐次发起重试
  • 若最终重试失败,消息进入死信队列

2.1 exception的情况

一般重复16次 10s、30s、1mins、2mins、3mins等。注意reconsumeTimes这个参数;

消息队列 RocketMQ 默认允许每条消息最多重试 16 次,每次重试的间隔时间如下:

第几次重试 与上次重试的间隔时间 第几次重试 与上次重试的间隔时间
1 10 秒 9 7 分钟
2 30 秒 10 8 分钟
3 1 分钟 11 9 分钟
4 2 分钟 12 10 分钟
5 3 分钟 13 20 分钟
6 4 分钟 14 30 分钟
7 5 分钟 15 1 小时
8 6 分钟 16 2 小时

如果消息重试 16 次后仍然失败,消息将不再投递。如果严格按照上述重试时间间隔计算,某条消息在一直消费失败的前提下,将会在接下来的 4 小时 46 分钟之内进行 16 次重试,超过这个时间范围消息将不再重试投递。

注意: 一条消息无论重试多少次,这些重试消息的 Message ID 不会改变。

2.2 超时情况

这种情况MQ会无限制的发送给消费端。


image.png

三、查看死信队列

当重试次数达到默认的16次后(可以通过配置文件修改)如果对应的消息还没被成功消费的话,该消息就会投递到DLQ死信队列。

当一条消息初次消费失败,消息队列 RocketMQ 会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 RocketMQ 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。

在消息队列 RocketMQ 中,这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)。

0.死信的特点

  • 不会再被消费者正常消费。
  • 有效期与正常消息相同,均为 3 天,3 天后会被自动删除。因此,请在死信消息产生后的 3 天内及时处理。

死信队列具有以下特性:

  • 一个死信队列对应一个 Group ID, 而不是对应单个消费者实例。
  • 如果一个 Group ID 未产生死信消息,消息队列 RocketMQ 不会为其创建相应的死信队列。
  • 一个死信队列包含了对应 Group ID 产生的所有死信消息,不论该消息属于哪个 Topic。

1.rocketMQ-console查看死信队列

image.png

不过,在使用控制台查询死信消息队列的时候会报错,具体如下图


image.png
org.apache.rocketmq.client.exception.MQClientException: Can not find Message Queue for this topic, %DLQ%consumer1 See http://rocketmq.apache.org/docs/faq/ for further details.

2.服务器命令行查看队列

  • 对应服务器进入相关的目录下,/usr/local/rocketmq/store/consumequeue,发现确实是存在%DLQ%consumer1
image.png

我们通过进入到,通过rocketmq的管理命令(先进入/usr/local/rocketmq/bin)查看所有的topic,发现也确实能够找到

sh mqadmin  topicList -n 192.168.140.129:9876;192.168.140.128:9876
image.png

3.查看该topic信息,发现perm为2

sh mqadmin  topicRoute -n 192.168.140.129:9876 -t %DLQ%consumer1
image.png

多个broker节点都要进行配置,设置perm为2

sh mqadmin  updateTopic -b 192.168.159.129:10911 -n 192.168.159.129:9876 -t %DLQ%consumer1 -p 6
sh mqadmin  updateTopic -b 192.168.159.128:10911 -n 192.168.159.128:9876 -t %DLQ%consumer1 -p 6

4.查看死信队列

image.png

5.Topic配置中perm的含义

作用: 设置该 Topic 的读写模式。

6:同时支持读写
4:禁写
2:禁读

参考

https://www.cnblogs.com/sunshine-2015/p/9011446.html

https://blog.csdn.net/grant167/article/details/102828772
死信队列
https://www.cnblogs.com/lhl-shubiao/p/11463414.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容