问题思考

  • 死信队列的应用场景?
  • 死信队列中的数据是如何产生的?
  • 如何查看死信队列中的数据?
  • 死信队列的读写权限?
  • 死信队列如何消费?
  • 重试队列和死信队列的配置
  • 消息轨迹

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之八:重试队列,死信队列,消息轨迹的更多相关文章

  1. SpringCloud 2020.0.4 系列之 Stream 消息出错重试 与 死信队列 的实现

    1. 概述 老话说的好:出错不怕,怕的是出了错,却不去改正.如果屡次出错,无法改对,就先记下了,然后找援军解决. 言归正传,今天来聊一下 Stream 组件的 出错重试 和 死信队列. RabbitM ...

  2. RabbitMQ与.net core(四) 消息的优先级 与 死信队列

    1.消息的优先级 假如现在有个需求,我们需要让一些优先级最高的通知推送到客户端,我们可以使用redis的sortedset,也可以使用我们今天要说的rabbit的消息优先级属性 Producer代码 ...

  3. Spring Boot系列——死信队列

    在说死信队列之前,我们先介绍下为什么需要用死信队列. 如果想直接了解死信对接,直接跳入下文的"死信队列"部分即可. ack机制和requeue-rejected属性 我们还是基于上 ...

  4. RabbitMQ 消费端限流、TTL、死信队列

    目录 消费端限流 1. 为什么要对消费端限流 2.限流的 api 讲解 3.如何对消费端进行限流 TTL 1.消息的 TTL 2.队列的 TTL 死信队列 实现死信队列步骤 总结 消费端限流 1. 为 ...

  5. 【RabbitMQ】一文带你搞定RabbitMQ死信队列

    本文口味:爆炒鱿鱼   预计阅读:15分钟 一.说明 RabbitMQ是流行的开源消息队列系统,使用erlang语言开发,由于其社区活跃度高,维护更新较快,性能稳定,深得很多企业的欢心(当然,也包括我 ...

  6. RabbitMQ TTL、死信队列

    TTL概念 TTL是Time To Live的缩写,也就是生存时间. RabbitMQ支持消息的过期时间,在消息发送时可以进行指定. RabbitMQ支持队列的过期时间,从消息入队列开始计算,只要超过 ...

  7. RabbitMQ之死信队列

    1:何为死信队列 死信队列也是一个正常的队列,可以被消费. 但是,死信队列的消息来源于其他队列的转发. 2:如何触发死信队列 1:消息超时 2:队列长度达到极限 3:消息被拒绝消费,并不再重进队列,且 ...

  8. 【MQ中间件】RabbitMQ -- RabbitMQ死信队列及内存监控(4)

    1.RabbitMQ TTL及死信队列 1.1.TTL概述 过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取:过了之后消息将自动被删除.RabbitMQ可以对消息和队列设 ...

  9. rabbitmq~消息失败后重试达到 TTL放到死信队列(事务型消息补偿机制)

    这是一个基于消息的分布式事务的一部分,主要通过消息来实现,生产者把消息发到队列后,由消费方去执行剩下的逻辑,而当消费方处理失败后,我们需要进行重试,即为了最现数据的最终一致性,在rabbitmq里,它 ...

随机推荐

  1. 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

  2. 基于VS2013的MFC窗体按钮事件触发案例(亲测可用)

    学过python的小朋友们一定对python freeze命令不陌生,这一命令用于导出python安装模块,用于新电脑可以快速的配置安装所需的模块,以便快速的加入项目. 那么我们大可以用 window ...

  3. Jquery调用Ajax实现联动使用json

    在很多时候我们都会使用到联动.jquery.js是一个不错的js框架.其ajax也挺不错.下面将实现一个js联动:选择公司出来受益人.根据公司不同受益人不同. 前提是:你用引入jquery.js &l ...

  4. 02 CSS和DIV对界面优化

    01 网站首页的优化 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  5. WebService如何封装XML请求 以及解析接口返回的XML

    原 WebService如何封装XML请求 以及解析接口返回的XML 置顶 2019年08月16日 15:00:47 童子泛舟 阅读数 28 标签: XML解析WebService第三方API 更多 ...

  6. 51 Nod 1110距离之和最小V3

    1110 距离之和最小 V3 1 秒 131,072 KB 40 分 4 级题 X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i].点P到点P[i]的带权距离 = 实际距离 * ...

  7. 【luoguP2483】k短路([SDOI2010]魔法猪学院)

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  8. Jmeter工具做接口测试

    一.安装Jmeter 1.安装JDK ①下载jdk,到官网下载jdk,地址:http://jmeter.apache.org/download_jmeter.cgi ② 安装jdk(Oracle官网下 ...

  9. HDU 3394 Railway —— (点双联通,记录块信息)

    这题是比较模板的找点双联通并记录的题目. 题意大概是:一个公园有n个景点,1.所有游客都是绕环旅游的,找出所有不在环内的路的条数:2.如果两个环中有重复的边,那么这些边是冲突的,问冲突的边的总数. 分 ...

  10. 判定Java程序员等级,HashMap就够了

    JDK1.8  HashMap源码分析 用到的符号: ^异运算:两个操作数相同,结果是;两个操作数不同,结果是1. &按位与:两个操作数都是1,结果才是1. 一.HashMap概述 在JDK1 ...