RocketMQ如何查询延时消息原始Topic

这里是小奏 ,觉得文章不错可以关注公众号小奏技术

背景

延时消息目前的实现目前有两种方式

  1. 旧版本的延时消息,仅支持固定时间的延时消息
arduino 复制代码
"1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h"
  1. 5.0基于时间轮重新设计支持任意时间的延时消息

这里我们要讨论的还第一种延时消息

延时消息投递

延时消息投递后比如通过如下方式

java 复制代码
message.setDelayTimeLevel(3);

仅需要对消息设置DelayTimeLevel即可。本质上仅仅是加了一个DELAY这个属性标识

延时消息查询

延时消息默认不是直接存储在我们发送的topic

举个简单例子

如果我们对xiaozou-topic进行发送延时消息。

实际投递到的topicSCHEDULE_TOPIC_XXXX

然后后台会有一个定时线程池去扫描,如果发现到期了后就从SCHEDULE_TOPIC_XXXX这个topic取出消息重新投递到xiaozou-topic这个topic

所以我们要查询延时消息需要去SCHEDULE_TOPIC_XXXX这个topic查询

如何知道延时消息是哪个topic的延时消息

如果我们通过SCHEDULE_TOPIC_XXXX查询出来的消息实际只有body

并不能看出来这条消息属于哪个topic

可能比如线上延时消息太多了。我们想要抽查一些延时消息看看哪个topic发送了大量延时消息,这时候该如何处理呢

实际我们知道延时消息的原始topic保存在properties

所以我们可以通过构造DefaultMQAdminExt去查询

比如我们使用如下代码

java 复制代码
        System.setProperty("rocketmq.namesrv.domain", "xiaozoujishu-nameserver.com:80");
        System.setProperty("rocketmq.namesrv.domain.subgroup", "nsaddr-1");

        DefaultMQAdminExt mqAdmin = new DefaultMQAdminExt(10000);

        mqAdmin.setAdminExtGroup("xiaozou-jishu");
        mqAdmin.start();
        MessageExt messageExt = mqAdmin.viewMessage("SCHEDULE_TOPIC_XXXX", "AC00960B000A09B4740022AA7BD20331");

这时候我们查询出来的消息我们看看properties属性

这里可以看到REAL_TOPIC能看到topic%RETRY%开头的

说明这条延时消息的原始topic就是这个,说明这是一条重试消息。

还记得我们之前聊过MQ的重试机制就是依赖于延时消息吗

RocketMQ源码分析之消息重试(真相竟然是延时消息)

上面其实还能看到RETRY_TOPIC可以看到重试前的topic

如果我们找一条正常的延时消息看看properties

这里可以看到相应的属性就少了几个

总结

老版本的延时消息默认是存储在SCHEDULE_TOPIC_XXXX这个topic,直接去原始topic查询消息是查询不到的

然后查询到延时消息想通过官方dashboard直接查看原始的topic也是不支持的

如果我们想查看延时消息具体是哪个topic的。我们可以通过viewMessage方法获取MessageExt对象,然后通过MessageExt对象获取propertiesproperties中就有原始的topic信息

相关推荐
掉头发的王富贵6 分钟前
ShardingSphere-JDBC入门教程(上篇)
spring boot·后端·mysql
Apache RocketMQ13 分钟前
云原生事件驱动引擎(RocketMQ-EventBridge)应用场景与技术解析
云原生·消息队列·rocketmq·事件驱动引擎
盖世英雄酱5813615 分钟前
必须掌握的【InheritableThreadLocal】
java·后端
LovelyAqaurius17 分钟前
乐观锁及其实现方式详解
后端
绝无仅有20 分钟前
编写 Go 项目的 Dockerfile 文件及生成 Docker 镜像
后端·面试·github
tager29 分钟前
🍪 让你从此告别“Cookie去哪儿了?”
前端·javascript·后端
ERP老兵_冷溪虎山29 分钟前
GoLand 卡成幻灯片?Gopher 必藏的 vmoptions 调优表(续集:WebStorm 飞升后,轮到 Go 开发神器起飞)
后端·go
绝无仅有31 分钟前
使用 Docker 部署 Go 项目(Beego 框架)
后端·面试·github
leonkay32 分钟前
C# 现代化锁的最佳实践
后端
紫穹32 分钟前
002.从0开始,实现第一个deepseek问答
后端