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进行发送延时消息。

实际投递到的topic是SCHEDULE_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对象获取properties,properties中就有原始的topic信息

相关推荐
ServBay15 分钟前
从代码到上线,Cursor Live Apps 能替独立开发者做什么
后端·ai编程·cursor
程序员cxuan18 分钟前
LobeHub 是真的夯,简直 Super-Agent 最佳实现。
人工智能·后端·程序员
挖坑的张师傅1 小时前
开源一个 Managed Agents 云端托管智能体平台
后端·agent
挖坑的张师傅1 小时前
Agent 基建系列:用 MCP Tunnel 让云端 Agent 访问企业内网工具
后端·agent
量化分析码农1 小时前
【Python量化多因子实战 04】因子暴露不是 alpha:市值与行业中性化实战
前端·后端
挖坑的张师傅1 小时前
开源 yourbatis:把 MyBatis 的动态 SQL 体验带到 Go
后端·agent
挖坑的张师傅1 小时前
Agent 基建系列:E2B Go SDK
后端·agent
挖坑的张师傅1 小时前
Agent 基建系列(二):基于 Proxy 的凭证不入沙箱和网络管控方案
后端·agent
挖坑的张师傅2 小时前
用 FUSE 为云端 Agent 构建文件系统
后端·agent
张彦峰ZYF2 小时前
放行、排队与拒绝:限流设计的算法选型、数据结构与并发代价
后端·架构·滑动窗口·漏桶·令牌桶·高并发+限流