发送的消息id与事件$events/message_acked中的消息ID不一致

环境信息

  • EMQX 版本:4.3.5
  • 操作系统及版本:
  • 其他

问题描述

我发送一条消息,消息id设置的是-1890011158(int类型,发送客户端是使用java),然后接收到的$events/message_acked事件中的ID是"id":“0005D959BD422FEB1DF314007ABE0002”。那我如何判断是我发送的消息确认被接收了呢?

配置文件及日志

这里的 id 是指 message id, 不是 packet id. message id 是有 EMQX 内部自动生成的唯一性的id

那我在java 客户端设置的messageid是什么呢?

那我在java服务端如何能获取到这个id呢?我如何通过$events/message_acked事件中的message id,判断是我发送的哪条消息呢?

首先,我们需要区分这几个概念

  1. EMQX 内部的 Message ID,通常用 id 表示, 取值是 16 字节的二进制。它代表是的 EMQX 内部对每条消息唯一的标识,是 EMQX内部生成的,每条消息发布 EMQX 都会生成这样一个 ID。这条消息被投递给 N 个订阅者时,这个 ID 仍然不变的。

  2. MQTT 协议上的 Packet ID,取值是 1-65535, 通常这个 ID 是没有对外暴露的,它指的是 MQTT 协议在传输的时候,标识每条 QoS1 和 QoS2 消息的 ID,是 MQTT 协议上的。而且只在一个客户端对服务端的MQTT连接中有效,一般来说是自增的。例如发布者发布一条消息 A,此时他的 Packet ID 是 128,这条消息被转发到了 3 个订阅者,在分别投递给这三个客户端时,他们的 Packet ID 可能是任何一个1-65535的数值。(可以参考 MQTT 协议标准)

  3. 我不太清楚 Java 客户端的 Message ID 是什么,肯定不是 1 ,也不像是 2 (你给的值看起来不太对…)所以他可能只是你 SDK 软件内部的一个标识而已。

在 EMQX 如果你想追踪一个消息的发布、投递成功,可以分别用 message_publish 事件,和 message_acked 事件,这里面都包含有 Message ID

注: message_acked 事件,仅在投递消息的QoS等级为QoS1, QoS2 时会触发。