全部产品
阿里云办公

消息查询

更新时间:2018-11-02 16:59:53

MQ 控制台提供几种消息查询方式用于问题排查。

适用场景

MQ 提供了三种消息查询的方式,分别是按 Messag ID,Message Key 以及 Topic 查询。

三种方式的特点和对比如下。

查询方式 查询条件 查询类别 说明
按 Message ID 查询 Topic+Message ID 精确查询 根据 Topic 和 Message ID 可以精确定位任意一条消息,获取消息的属性
按 Message Key 查询 Topic+Message Key 模糊查询 根据 Topic 和 Message Key 可以匹配到包含指定 Key 的最近 64 条消息,建议消息生产方为每条消息设置尽可能唯一的 Key,以确保相同的 Key 的消息不会超过 64 条,否则消息会漏查
按 Topic 查询 Topic+时间段 范围查询 根据 Topic 和时间范围,批量获取符合条件的所有消息,查询量大,不易匹配

建议查询过程:

msquery

按 Message ID 查询

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

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

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

查询结果说明

查询到消息后,您可以在消息详情页面看到每条消息的基本属性,消息体下载链接以及消息的消费状态。

其中,投递状态是 MQ 根据各个 Consumer ID 的消费进度计算出的结果,投递状态的信息参考以下表格。

注意:投递状态仅仅是根据消费进度估算的结果,如果需要详细的消费信息,请使用消息轨迹工具查询。 消息轨迹可以展示该条消息的完整链路,具体请参见查询消息轨迹

投递状态表

投递状态 可能的原因
已订阅,并且消息至少已被消费一次 该 Consumer ID 已经正常消费过这条消息。
已订阅,但消息被过滤表达式过滤,请查看 Tag 该消息的 Tag 不符合消费方的订阅关系,消息被过滤。您可以进入控制台中的消费者管理,然后单击该 Consumer ID 的操作列的消费者状态查询其订阅关系。
已订阅,但消息未被消费 该 Consumer ID 订阅了该消息,但还未消费。有可能是消费过慢,或者消费出现异常导致阻塞。
已订阅,但 Consumer ID 当前不在线,请通过消息轨迹功能进行精确查询 该 Consumer ID 订阅了该消息,但是不在线。请检查消费者端应用不在线的原因。
未知异常 出现未收录的异常情况。请提工单进行解决。

消费验证

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

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

按 Message Key 查询

按 Message Key 查询消息的原理是,MQ 根据您设置的 Message Key 建立消息的索引信息,当您输入 Key 进行查询时,MQ 根据该索引即可匹配相关的消息返回。

注意:

  • 按 Message Key 查询的条件是用户设置的 Message Key 属性。
  • 按 Message Key 查询仅仅返回符合条件的最近的 64 条消息,因此建议您尽可能保证设置的 Key 是唯一的,并具有业务区分度。

设置 Message Key 的方法如下:

  1. Message msg = new Message("Topic","*","Hello MQ".getBytes());
  2. /**
  3. * 对每条消息设置其检索的 Key,该 Key 值代表消息的业务关键属性,请尽可能全局唯一。
  4. * 以方便您在无法正常收到消息情况下,可通过 MQ 控制台查询消息。 不设置也不会影响消息正常收发。
  5. */
  6. msg.setKey("TestKey"+System.currentTimeMillis());

按 Topic 查询

按 Topic 查询一般用在前两种查询条件都无法获得的情况下,根据 Topic 和消息的发送时间范围,批量获取该时间范围内的所有消息,然后再找到关心的数据。

注意:

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