如遇消息消费有问题,则可通过查询具体发送的消息内容来排查问题。消息队列 RocketMQ 提供了三种消息查询的方式,分别是按 Message ID、Message Key 以及 Topic 查询。
查询方式说明
由于消息在消息队列 RocketMQ 中存储的时间为 3 天,即只能查询从当前查询时间算起 3 天内的消息。例如,当前时间是 2019 年 6 月 10 日 15:09:48,那么能查询到的某 Topic 下的消息最早的时间点为 2019 年 6 月 7 日 15:09:48。
三种查询方式的特点和对比如下表所述。
查询方式 | 查询条件 | 查询类别 | 说明 |
---|---|---|---|
按 Message ID 查询 | Topic+Message ID | 精确查询 | 根据 Topic 和 Message ID 可以精确定位任意一条消息,获取消息的属性。 |
按 Message Key 查询 | Topic+Message Key | 模糊查询 | 根据 Topic 和 Message Key 可以匹配到包含指定 Key 的最近 64 条消息。 注意:建议消息生产方为每条消息设置尽可能唯一的 Key,以确保相同的 Key 的消息不会超过 64 条,否则消息会漏查。 |
按 Topic 查询 | Topic+时间段 | 范围查询 | 根据 Topic 和时间范围,批量获取符合条件的所有消息,查询量大,不易匹配。 |
推荐查询过程
推荐按照以下流程查询消息。
操作步骤
登录消息队列 RocketMQ 控制台。在左侧导航栏,单击消息查询。
在消息查询页面,您可单击以下任一页签,然后按页面提示输入相应信息,再单击搜索按钮来查询消息。
- 按 Message ID 查询
按 Message ID 查询消息属于精确查询,您输入 Topic 和 Message ID 即可精确查询到任意一条消息。因此,为了尽可能精确地查询,建议在发送消息成功后将 Message ID 信息打印到日志中,方便问题排查。
以 Java SDK 为例,获取 Message ID 的方法如下:
其他语言可参见 Group 管理页面的示例代码获取。SendResult sendResult = producer.send(msg); String msgId = sendResult.getMessageId();
- 按 Message Key 查询
消息队列 RocketMQ 根据您设置的 Message Key 建立消息的索引信息,当您输入 Key 进行查询时,消息队列 RocketMQ 根据该索引即可匹配相关的消息返回。
注意:
若按 Message Key 查询消息,请注意以下几点:- 按 Message Key 查询的条件是用户设置的 Message Key 属性。
- 按 Message Key 查询仅仅返回符合条件的最近的 64 条消息,因此建议您尽可能保证设置的 Key 是唯一的,并具有业务区分度。
设置 Message Key 的方法如下:Message msg = new Message("Topic","*","Hello MQ".getBytes()); /** * 对每条消息设置其检索的 Key,该 Key 值代表消息的业务关键属性,请尽可能全局唯一。 * 以方便您在无法正常收到消息情况下,可通过消息队列 RocketMQ 控制台查询消息。 不设置也不会影响消息正常收发。 */ msg.setKey("TestKey"+System.currentTimeMillis());
- 按 Topic 查询
按 Topic 查询一般用在 Message ID 和 Message Key 都无法获得的情况下,根据 Topic 和消息的发送时间范围,批量获取该时间范围内的所有消息,然后再找到关心的数据。
注意:
若按 Topic 查询消息,请注意以下几点:- 按 Topic 查询属于范围查询,获取 Topic 下符合时间条件的所有消息,消息量大,建议尽量缩短查询区间。
- 按 Topic 查询数据量大,采用分页展示。
查询结果说明
您可以在控制台的消息查询页面看到查询到的消息。直接显示的信息包含 Message ID、Tag、Key 和存储时间。此外,您还可以在每一行消息的操作列下载消息内容、查询消息轨迹以及查看消息详情。
查看消息详情
其中,投递状态是消息队列 RocketMQ 根据各个 Group ID 的消费进度计算出的结果,投递状态的信息参考以下表格。
注意:投递状态仅仅是根据消费进度估算的结果,如果需要详细的消费信息,请使用消息轨迹工具查询。消息轨迹可以展示该条消息的完整链路,详情参见查询消息轨迹。
投递状态表
投递状态 | 说明 |
---|---|
已订阅,并且消息至少已被消费一次 | 该 Group ID 已经正常消费过这条消息。 |
已订阅,但消息被过滤表达式过滤,请查看 Tag | 该消息的 Tag 不符合消费方的订阅关系,消息被过滤,即未被消费。您可以进入控制台中的 Group 管理,然后单击该 Group ID 的操作列的消费者状态查询其订阅关系。 |
已订阅,但消息未被消费 | 该 Group ID 订阅了该消息,但还未消费。有可能是消费过慢,或者消费出现异常导致阻塞。 |
已订阅,但 Group ID 当前不在线,请通过消息轨迹功能进行精确查询 | 该 Group ID 订阅了该消息,但是不在线。请检查消费者端应用不在线的原因。 |
未知异常 | 出现未收录的异常情况。请提交工单进行解决。 |
文档反馈
(如有产品使用问题,请 提交工单)