本文主要介绍消息队列 TDMQ RocketMQ 版中消息重试与使用方法。
功能介绍
当消息第一次被消费者消费后,没有得到正常的回应,或者用户主动要求服务端重投,TDMQ RocketMQ 版会通过消费重试机制自动重新投递该消息,直到该消息被成功消费,当重试达到一定次数后,消息仍未被成功消费,则会停止重试,将消息投递到死信队列中。
当消息进入到死信队列中,表示 TDMQ RocketMQ 版已经无法自动处理这批消息,一般这时就需要人为介入来处理这批消息。您可以通过编写专门的客户端来订阅死信 Topic,处理这批之前处理失败的消息。
说明:
只有当消费模式为集群消费模式时,Broker 才会自动进行重试,广播消费模式下不会进行重试。
出现以下三种情况会按照消费失败处理并会发起重试:
1. 消费者返回 ConsumeConcurrentlyStatus.RECONSUME_LATER。
2. 消费者返回 null。
3. 消费者主动/被动抛出异常。
重试次数
当消息需要重试时,TDMQ RocketMQ 中配置了如下的 messageDelayLevel 参数来设置重试次数与时间间隔。
messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
重试次数与重试时间间隔关系如下,由于 SDK 中第一次 delayLevel 为3,所以:
第几次重试 | 距离上一次重试的时间间隔 | 第几次重试 | 距离上一次重试的时间间隔 |
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小时 |
使用方式
如果用户需要自行调整这个重试次数。可以通过设置 consumer 的参数来决定。
pushConsumer.setMaxReconsumeTimes(3);