如遇消息消费有问题,则可通过查询具体发送的消息内容来排查问题。消息队列RocketMQ版提供了三种消息查询的方式,分别是按Message ID、Message Key以及Topic查询。

查询方式说明

由于消息在消息队列RocketMQ版中存储的时间默认为3天(不建议修改),即只能查询从当前查询时间算起3 天内的消息。例如,当前时间是2019年06月10日15:09:48,那么能查询到的某Topic下的消息最早的时间点为2019年06月07日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版控制台
  2. 在左侧导航栏,单击实例列表
  3. 在顶部菜单栏,选择地域,如华东1(杭州)
  4. 实例列表页面,找到目标实例,在其操作列,单击更多,然后在下拉菜单中,选择消息查询
  5. 消息查询页面,您可选择以下任意一种查询方式,然后按页面提示输入相应信息,再单击查询来查询消息。
    • 按 Message ID 查询

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

      query_message_by_messageid

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

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

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

    • 按 Message Key 查询

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

      query_message_by_messagekey
      注意

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

      query_message_by_topic
      注意

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

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

查询结果说明

您可以在控制台的消息查询页面看到查询到的消息。直接显示的信息包含Message ID、Tag、Key、生成时间及存储时间。此外,您还可以查询消息轨迹、进行消费验证以及下载消息。

消费验证

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

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