如遇消息消费有问题,则可通过查询具体发送的消息内容来排查问题。消息队列 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 和时间范围,批量获取符合条件的所有消息,查询量大,不易匹配。

推荐查询过程

推荐按照以下流程查询消息。

查询流程

操作步骤

  1. 登录消息队列 RocketMQ 版控制台。在顶部菜单栏,选择地域(Region),如华东1(杭州)
  2. 实例列表页面,找到目标实例,在其操作列,单击详情
  3. 在左侧导航栏,单击消息查询
  4. 消息查询页面,您可单击以下任一页签,然后按页面提示输入相应信息,再单击搜索来查询消息。
    • 按 Message ID 查询

      按 Message ID 查询消息属于精确查询,您输入 Topic 和 Message ID 即可精确查询到任意一条消息。因此,为了尽可能精确地查询,建议在发送消息成功后将 Message ID 信息打印到日志中,方便问题排查。

      by-messageid

      以 Java SDK 为例,获取 Message ID 的方法如下。

         SendResult sendResult = producer.send(msg);
         String msgId = sendResult.getMessageId();

      其他语言可参见 Group 管理页面的示例代码获取。

    • 按 Message Key 查询

      消息队列 RocketMQ 版根据您设置的 Message Key 建立消息的索引信息,当您输入 Key 进行查询时,消息队列 RocketMQ 版根据该索引即可匹配相关的消息返回。

      by-message-key
      注意

      若按 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 和消息的发送时间范围,批量获取该时间范围内的所有消息,然后再找到关心的数据。

      by-topic
      注意

      若按 Topic 查询消息,请注意以下几点:

      • 按 Topic 查询属于范围查询,获取 Topic 下符合时间条件的所有消息,消息量大,建议尽量缩短查询区间。
      • 按 Topic 查询数据量大,采用分页展示。

查询结果说明

您可以在控制台的消息查询页面看到查询到的消息。直接显示的信息包含 Message ID、Tag、Key、存储时间以及消息详情。此外,您还可以下载消息内容、查询消息轨迹以及通过单击 Group ID 实现消费验证

消费验证

消息队列 RocketMQ 版提供了消费验证功能,该功能可以将指定消息推送给指定的在线客户端,以检测客户端消费该消息的逻辑和结果是否符合预期。

注意 消费验证功能仅用于验证客户端的消费逻辑是否正常,并不会影响正常的收消息流程,因此消息的消费状态等信息在消费验证后并不会改变。
consume-validate