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

相关推荐
容若只如初见3 小时前
项目实战--Spring Boot + Minio文件切片上传下载
java·spring boot·后端
码农爱java3 小时前
Spring Boot 中的监视器是什么?有什么作用?
java·spring boot·后端·面试·monitor·监视器
Apifox.4 小时前
什么是 HTTP POST 请求?初学者指南与示范
后端·http·学习方法·web
无名指的等待7124 小时前
SpringBoot实现图片添加水印(完整)
java·spring boot·后端
甜甜圈的小饼干8 小时前
Spring Boot+Vue项目从零入手
vue.js·spring boot·后端
我曾遇到一束光8 小时前
Spring boot 更改启动LOGO
数据库·spring boot·后端
tiger_angel9 小时前
springboot集成gzip和zip数据压缩传输-满足2k数据自动压缩(适用大数据信息传输)
大数据·spring boot·后端·数据压缩·压缩数据·压缩传输消息
笔触狂放9 小时前
【Django】网上蛋糕项目商城-关键字搜索,商品详情功能
后端·python·django
q567315239 小时前
Python 3.x 下的 3D 游戏引擎
开发语言·后端·python·3d·django·游戏引擎
奋斗的袍子00710 小时前
SpringBoot:SpringBoot统一响应和统一异常处理
java·spring boot·后端·spring·统一异常处理·统一响应·自定义异常