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

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:禁读