微消息队列 MQTT 版提供同步查询和异步上下线事件通知两种方式,来获取 MQTT 客户端在线状态。本文介绍这两种方式的基本原理、应用场景、具体差异以及实现方式。

基本原理

微消息队列 MQTT 版服务端(下文简称为 MQTT 服务端)提供以下方式获取客户端在线状态:
  • 同步查询

    该方式相对简单,即通过开放的接入点地址调用 HTTP/HTTPS 方式的 OpenAPI 查询某个特定客户端的当前实时状态,适用于对单个或多个客户端的状态判断。

  • 异步上下线事件通知

    该方式使用消息通知,在客户端上线和下线事件触发时,MQTT 服务端会通过上下线通知规则向其他阿里云产品推送一条上下线消息。业务应用一般部署在阿里云的服务器上,业务应用通过向其他阿里云产品订阅这条消息来获取所有客户端的上下线动作。

    说明 当前支持的其他阿里云产品仅包含消息队列 RocketMQ 版

    该方式属于异步感知客户端的状态,且感知到的是上下线事件,而非在线状态,云端应用需要根据事件发生的时间序列分析出客户端的状态。

应用场景

两种获取 MQTT 客户端在线状态的方式分别应用于以下场景:

  • 同步查询
    • 主业务流程中需要根据客户端是否在线来决定后续运行逻辑。
    • 运维过程需要判断特定客户端当前是否在线。
  • 异步事件通知
    • 服务端需要在客户端上线或者下线时触发一些预定义的动作。

同步查询与异步事件通知的差异

两种查询方式的区别如下:
  • 同步查询是查询当前客户端的实时状态,理论上比异步通知的方式更精确。
  • 异步上下线通知因为采用消息解耦,状态判断更加复杂,且误判可能性更大,但该方法可以基于事件分析多个客户端的运行状态轨迹。异步通知虽然存在一定复杂度和误判,但更加适合大规模的客户端的状态统计。

实现方式