RocketMQ之八:重试队列,死信队列,消息轨迹
问题思考
- 死信队列的应用场景?
- 死信队列中的数据是如何产生的?
- 如何查看死信队列中的数据?
- 死信队列的读写权限?
- 死信队列如何消费?
- 重试队列和死信队列的配置
- 消息轨迹
1、应用场景
一般应用在当正常业务处理时出现异常时,将消息拒绝则会进入到死信队列中,有助于统计异常数据并做后续的数据修复处理;
2、数据是如何产生的?
重试队列在重试16次(默认次数)将消息放入死信队列
参考: https://blog.csdn.net/hqwang4/article/details/99971596
3、如何查看死信队列中的数据?

通过console查看死信队列的消息,报如下异常:
org.apache.rocketmq.client.exception.MQClientException:
Can not find Message Queue for this topic, %DLQ%RetryConsumer See
http://rocketmq.apache.org/docs/faq/ for further details.
但是在broker机器上通过命令行查看topic,死信队列确实存在。
sh bin/mqadmin topiclist -n 10.200.110.46:9876;10.200.110.101:9876

4、死信队列的读写权限
4.1、查看该topic信息,发现perm为2
sh bin/mqadmin topicRoute -n 10.200.110.46:9876 -n 10.200.110.101:9876 -t %DLQ%groupnamedef2
[root@localhost rocketmq-4.5.2]# sh bin/mqadmin topicRoute -n 10.200.110.46:9876 -n 10.200.110.101:9876 -t %DLQ%groupnamedef2
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
{
"brokerDatas":[
{
"brokerAddrs":{0:"10.200.110.46:10911"
},
"brokerName":"broker-b",
"cluster":"rocketmq-cluster"
}
],
"filterServerTable":{},
"queueDatas":[
{
"brokerName":"broker-b",
"perm":2,
"readQueueNums":1,
"topicSynFlag":0,
"writeQueueNums":1
}
]
}
[root@localhost rocketmq-4.5.2]#
4.2、修改死信队列的权限
命令行方式:
第一个broker机器执行:sh mqadmin updateTopic -b 10.200.110.46:10911 -n 10.200.110.46:9876 -t %DLQ% groupnamedef2 -p 6
[root@localhost rocketmq-4.5.2]# sh bin/mqadmin updateTopic -b 10.200.110.46:10911 -n 10.200.110.46:9876 -t %DLQ% groupnamedef2 -p 6
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
create topic to 10.200.110.46:10911 success.
TopicConfig [topicName=%DLQ%, readQueueNums=8, writeQueueNums=8, perm=RW-, topicFilterType=SINGLE_TAG, topicSysFlag=0, order=false][root@localhost rocketmq-4.5.2]#
第二个broker机器执行:sh mqadmin updateTopic -b 10.200.110.48:10911 -n 10.200.110.46:9876 -t %DLQ% groupnamedef2 -p 6
[root@localhost rocketmq-4.5.2]# sh bin/mqadmin updateTopic -b 10.200.110.48:10911 -n 10.200.110.46:9876 -t %DLQ% groupnamedef2 -p 6
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
create topic to 10.200.110.48:10911 success.
TopicConfig [topicName=%DLQ%, readQueueNums=8, writeQueueNums=8, perm=RW-, topicFilterType=SINGLE_TAG, topicSysFlag=0, order=false][root@localhost rocketmq-4.5.2]#
或者在控制台中操作:
查看死信队列的权限及修改该topic为写权限
修改死信队列读写权限后,查询Message
5、死信队列如何消费
死信队列中的数据需要通过新订阅该topic进行消费。
每个topic被消费后,如果消费失败超过次数会进入重试队列、死信队列等。名称会以
- %RETRY%消费组名称
- %DLQ%消费组名称
例如:
我的普通队列是:topic-0903
消费组及消费者是:
mq.rocketmq.consumers[3].topic: topic-0903~*
mq.rocketmq.consumers[3].groupName: group0903
多次消费失败后,会生成:

如果要通过API读取死信队列的内容,即%DLQ%group0903的内容,则需要重新定义消费者:
消费死信队列%DLQ%group0903的消费者定义:
mq.rocketmq.consumers[4].topic: '%DLQ%group0903~*'
mq.rocketmq.consumers[4].groupName: groupdlq0903
mq.rocketmq.consumers[4].id: "rocketmq_consumer_dlq0903"
6、重试队列和死信队列的配置
消费端,一直不回传消费的结果。rocketmq认为消息没收到,consumer下一次拉取,broker依然会发送该消息。
所以,任何异常都要捕获返回ConsumeConcurrentlyStatus.RECONSUME_LATER,rocketmq会放到重试队列。
这个重试TOPIC的名字是
%RETRY%+consumergroup的名字
在控制台上过一会就可以查到。
重试的消息在延迟的某个时间点(默认是10秒,业务可设置)后,再次投递到这个ConsumerGroup。而如果一直这样重复消费都持续失败到一定次数(默认16次),就会投递到DLQ死信队列,此时需要人工干预了。
消息重试的间隔时间可以在broker端配置:
在broker的配置文件里配置:messageDelayLevel =1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
例如:

我的重试间隔时间为5秒,订阅死信队列的消费端收到消息并打印。

7、消息轨迹
1.Broker配置 首先看下broker.conf配置的两个属性
|
属性 |
默认值 |
|---|---|
|
traceTopicEnable |
false |
|
msgTraceTopicName |
RMQ_SYS_TRACE_TOPIC |


RocketMQ之八:重试队列,死信队列,消息轨迹的更多相关文章
- SpringCloud 2020.0.4 系列之 Stream 消息出错重试 与 死信队列 的实现
1. 概述 老话说的好:出错不怕,怕的是出了错,却不去改正.如果屡次出错,无法改对,就先记下了,然后找援军解决. 言归正传,今天来聊一下 Stream 组件的 出错重试 和 死信队列. RabbitM ...
- RabbitMQ与.net core(四) 消息的优先级 与 死信队列
1.消息的优先级 假如现在有个需求,我们需要让一些优先级最高的通知推送到客户端,我们可以使用redis的sortedset,也可以使用我们今天要说的rabbit的消息优先级属性 Producer代码 ...
- Spring Boot系列——死信队列
在说死信队列之前,我们先介绍下为什么需要用死信队列. 如果想直接了解死信对接,直接跳入下文的"死信队列"部分即可. ack机制和requeue-rejected属性 我们还是基于上 ...
- RabbitMQ 消费端限流、TTL、死信队列
目录 消费端限流 1. 为什么要对消费端限流 2.限流的 api 讲解 3.如何对消费端进行限流 TTL 1.消息的 TTL 2.队列的 TTL 死信队列 实现死信队列步骤 总结 消费端限流 1. 为 ...
- 【RabbitMQ】一文带你搞定RabbitMQ死信队列
本文口味:爆炒鱿鱼 预计阅读:15分钟 一.说明 RabbitMQ是流行的开源消息队列系统,使用erlang语言开发,由于其社区活跃度高,维护更新较快,性能稳定,深得很多企业的欢心(当然,也包括我 ...
- RabbitMQ TTL、死信队列
TTL概念 TTL是Time To Live的缩写,也就是生存时间. RabbitMQ支持消息的过期时间,在消息发送时可以进行指定. RabbitMQ支持队列的过期时间,从消息入队列开始计算,只要超过 ...
- RabbitMQ之死信队列
1:何为死信队列 死信队列也是一个正常的队列,可以被消费. 但是,死信队列的消息来源于其他队列的转发. 2:如何触发死信队列 1:消息超时 2:队列长度达到极限 3:消息被拒绝消费,并不再重进队列,且 ...
- 【MQ中间件】RabbitMQ -- RabbitMQ死信队列及内存监控(4)
1.RabbitMQ TTL及死信队列 1.1.TTL概述 过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取:过了之后消息将自动被删除.RabbitMQ可以对消息和队列设 ...
- rabbitmq~消息失败后重试达到 TTL放到死信队列(事务型消息补偿机制)
这是一个基于消息的分布式事务的一部分,主要通过消息来实现,生产者把消息发到队列后,由消费方去执行剩下的逻辑,而当消费方处理失败后,我们需要进行重试,即为了最现数据的最终一致性,在rabbitmq里,它 ...
随机推荐
- Hive启动报错Terminal initialization failed; falling back to unsupported java.lang.Incomp
这个报错需要删除hadoop目录下,需要删除下面目录下的文件,重启hadoop和hive即可 $HADOOP_HOME/share/hadoop/yarn/lib/jline-0.9.94.jar
- 基于VS2013的MFC窗体按钮事件触发案例(亲测可用)
学过python的小朋友们一定对python freeze命令不陌生,这一命令用于导出python安装模块,用于新电脑可以快速的配置安装所需的模块,以便快速的加入项目. 那么我们大可以用 window ...
- Jquery调用Ajax实现联动使用json
在很多时候我们都会使用到联动.jquery.js是一个不错的js框架.其ajax也挺不错.下面将实现一个js联动:选择公司出来受益人.根据公司不同受益人不同. 前提是:你用引入jquery.js &l ...
- 02 CSS和DIV对界面优化
01 网站首页的优化 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- WebService如何封装XML请求 以及解析接口返回的XML
原 WebService如何封装XML请求 以及解析接口返回的XML 置顶 2019年08月16日 15:00:47 童子泛舟 阅读数 28 标签: XML解析WebService第三方API 更多 ...
- 51 Nod 1110距离之和最小V3
1110 距离之和最小 V3 1 秒 131,072 KB 40 分 4 级题 X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i].点P到点P[i]的带权距离 = 实际距离 * ...
- 【luoguP2483】k短路([SDOI2010]魔法猪学院)
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- Jmeter工具做接口测试
一.安装Jmeter 1.安装JDK ①下载jdk,到官网下载jdk,地址:http://jmeter.apache.org/download_jmeter.cgi ② 安装jdk(Oracle官网下 ...
- HDU 3394 Railway —— (点双联通,记录块信息)
这题是比较模板的找点双联通并记录的题目. 题意大概是:一个公园有n个景点,1.所有游客都是绕环旅游的,找出所有不在环内的路的条数:2.如果两个环中有重复的边,那么这些边是冲突的,问冲突的边的总数. 分 ...
- 判定Java程序员等级,HashMap就够了
JDK1.8 HashMap源码分析 用到的符号: ^异运算:两个操作数相同,结果是;两个操作数不同,结果是1. &按位与:两个操作数都是1,结果才是1. 一.HashMap概述 在JDK1 ...