一、消息发送端失败,重试
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:禁读