本文为您介绍MQTT 5.0的新特性共享订阅。
背景信息
MQTT协议基于发布订阅者模式设计,一条消息发布后,所有的订阅者都可以收到。但在有些场景下,用户只希望一个或者几个订阅者可以收到特定消息,共享订阅就适用于这种场景,共享订阅需要订阅者订阅时添加共享订阅标记及订阅组。
每个订阅组内只有一个订阅者可以收到消息。
在上图中,订阅者C、订阅者D、发布者A都遵循标准流程,订阅topic:demo/topic
和发布消息topic:demo/topic
。因为订阅者A、订阅者B使用了共享订阅的能力,所以只会随机发给A或者B其中一个。
共享订阅topic:$share/group/demo/topic
包含:
共享订阅标记:
$share
订阅组:
group1
,由用户指定。原始topic:
demo/topic
,由用户自定义。
物联网平台通过订阅标记$share
和订阅组group1识别目标订阅为共享订阅且所属的订阅组为group1
。共享订阅也支持通配,例如订阅所有消息,可以订阅topic:$share/group1/#
。
使用限制
目前只有尊享型实例的云网关和标准MQTT型实例支持共享订阅。
如果在单个共享订阅分组中存在多个共享订阅者,则物联网平台随机选择一位订阅者推送消息。
目前只有MQTT 5.0协议接入的设备支持共享订阅,使用MQTT 3.1协议接入的设备即使符合共享订阅规则,也不支持共享订阅。
使用场景
服务端负载均衡
当大量设备接入物联网平台并向物联网平台发送消息时,需要有多个业务服务端来处理这些消息,物联网平台的共享订阅特性可以帮助客户将消息分发到多个业务服务端,实现负载均衡。在下图中,业务服务端A、B使用相同的订阅组,物联网平台会把设备相关消息随机推送给A或者B。
阿里云物联网平台服务订阅已经集成共享订阅的能力,可以通过AMQP将消息发送给业务服务端。更多信息,请参见什么是服务端订阅。
服务端任务调度
基于共享订阅能力,用一条消息表示一个任务,可以随机将每个任务派送给单个物联网设备,实现简单的任务调度。例如下图中物联网设备为机器人,业务服务端下达一个搬运任务,只需要一台设备响应,共享订阅功能会将搬运任务只推送给其中一个机器人。