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信息

相关推荐
Yeats_Liao1 小时前
Go Web 编程快速入门 06 - 响应 ResponseWriter:状态码与头部
开发语言·后端·golang
mit6.8241 小时前
[Agent可视化] 编排工作流(Go) | Temporal引擎 | DAG调度器 | ReAct模式实现
开发语言·后端·golang
猪哥-嵌入式2 小时前
Go语言实战教学:从一个混合定时任务调度器(Crontab)深入理解Go的并发、接口与工程哲学
开发语言·后端·golang
thinktik3 小时前
AWS EKS 计算资源自动扩缩之Fargate[AWS 海外区]
后端·kubernetes·aws
不爱编程的小九九3 小时前
小九源码-springboot099-基于Springboot的本科实践教学管理系统
java·spring boot·后端
lang201509283 小时前
Spring Boot集成Spring Integration全解析
spring boot·后端·spring
雨夜之寂3 小时前
第一章-第二节-Cursor IDE与MCP集成.md
java·后端·架构
大G的笔记本4 小时前
Spring IOC和AOP
java·后端·spring
武子康4 小时前
Java-155 MongoDB Spring Boot 连接实战 | Template vs Repository(含索引与常见坑)
java·数据库·spring boot·后端·mongodb·系统架构·nosql
野犬寒鸦4 小时前
从零起步学习MySQL || 第八章:索引深入理解及高级运用(结合常见优化问题讲解)
java·服务器·数据库·后端·mysql