亚马逊AWS官方博客
AWS IoT Core 共享订阅功能
什么是 AWS IoT Core 共享订阅功能
AWS IoT Core 支持 MQTT 3 和 MQTT 5 的共享订阅。 使用共享订阅,MQTT3 或 MQTT5 客户端可以将大量入站消息分发给一组订阅用户,以便以更高效的方式处理消息。这是通过将每条消息随机传递给其中一个订阅用户来实现的,从而将消息处理负载分散到更大的处理器集上,以下是非共享订阅和共享订阅的区别:
非共享订阅:每个客户端创建单独的订阅以接收已发布的消息。当消息发布到某个主题时,该主题的所有订阅用户都会收到该消息的副本。
共享订阅:多个客户端可以共享对一个主题的订阅,并且只有一个客户端会收到以随机分布方式发布到该主题的消息。
何时使用 AWS IoT Core 共享订阅功能
当用户想实现以下特性的时候,可以考虑使用共享订阅:
- 负载均衡: 共享订阅允许多个消费者订阅相同的主题,但只有一个订阅者接收消息。这样可以确保在高负载情况下,消息的处理被分散到多个消费者之间,从而实现负载均衡。
- 高可用性: 通过将消息传递负载分配到多个消费者,共享订阅提高了系统的可用性。即使一个消费者离线或者故障,其他消费者仍然可以继续处理消息,确保服务的持续性。
- 降低延迟: 由于消息处理被分布到多个消费者之间,共享订阅有助于降低消息处理的延迟。这对于对实时性要求较高的应用程序特别重要。
例如,假设您有 1000 台设备发布到同一个主题,有 10 个后端应用程序正在处理这些消息。在这种情况下,后端应用程序可以订阅同一个主题,并且每个应用程序都会随机接收设备向共享主题发布的消息。这实际上是“共享”这些消息的负载。共享订阅还可以提高弹性。当任何后端应用程序断开连接时,代理会将负载分配给组中剩余的订阅用户。
如何使用 AWS IoT Core 共享订阅功能
MQTT5 标准中定义的共享订阅适用于 MQTT3 和 MQTT5 客户端。它不使用任何 MQTT 5 特定的功能,而是使用一个专用的保留主题空间,即 $share。新的和现有的 MQTT3 客户端都可以发布或订阅共享订阅。
要使用共享订阅,客户需要按如下方式订阅共享订阅的主题筛选条件:
$share/{ShareName}/{TopicFilter}
- $share 是一个文本字符串,用于表示共享订阅的主题筛选条件,该筛选条件必须以 $share 开头。
- {ShareName} 是一个字符串,用于指定一组订阅用户使用的共享名称。共享订阅的主题筛选条件必须包含 ShareName 且后跟 / 字符。{ShareName} 不得包含以下字符:/、+ 或 #。{ShareName} 的最大大小为 128 字节。
- {TopicFilter} 遵循与非共享订阅相同的主题筛选条件语法。{TopicFilter} 的最大大小为 256 字节。
使用共享订阅,有以下重要注意事项:
- 当针对 QoS0 订阅用户的发布尝试失败时,不会尝试进行重试,并且消息将被丢弃。
- 当针对具有干净会话的 QoS1 订阅用户的发布尝试失败时,该消息将发送给该组中的另一个订阅用户以尝试进行多次重试。在尝试所有重试后仍未能传送的消息将被丢弃。
- 当针对具有持久性会话的 QoS1 订阅用户的发布尝试因订阅用户处于离线状态而失败时,消息将不会排队,而是会尝试发送给组中的其他订阅用户。在尝试所有重试后仍未能传送的消息将被丢弃。
在 MQTT 客户端中测试共享订阅功能
用户可以在 AWS IoT 控制台中使用 AWS IoT MQTT 客户端查看通过共享订阅发送和接收的 AWS IoT MQTT 消息。共享订阅允许多个客户端共享一个主题的订阅,只有一个客户接收使用随机分布发布到该主题的消息。要模拟多个 MQTT 客户端(在本例中为两个 MQTT 客户端)共享同一个订阅,您可以通过多个 Web 浏览器在 AWS IoT 控制台中打开 AWS IoT MQTT 客户端。
1)在 AWS IoT 控制台中,在导航窗格中选择测试,然后选择 MQTT 测试客户端。
2)在订阅主题中,输入 topicName 订阅您的设备发布的主题。要使用共享订阅,请按如下方式订阅共享订阅的主题筛选条件:
$share/{ShareName}/{TopicFilter},例如这里的示例是 $share/group/test_topic,它订阅消息主题 test_topic。
3)打开另一个 Web 浏览器,重复步骤 1 和步骤 2。通过这种方式,您可以模拟共享相同订阅 $share/group/test_topic 的两个不同的 MQTT 客户端。
4)打开第三个 Web 浏览器,在发布到主题选项卡到主题名称中,输入 topicname,在此示例中,使用 test_topic。尝试发布消息 2 次。
5)可以在两个 MQTT 客户端的订阅列表中,能够看到客户端使用随机分布接收消息。在此示例中,我们发布了两条消息”test message 1″和”test message 2″。第一个 MQTT 客户端收到消息”test message 2″,第二个 MQTT 客户端收到消息”test message 1″。
总结
在本文中,介绍了什么是共享订阅,在什么场景下使用共享订阅以及如何使用共享订阅,最后在 MQTT 客户端中进行测试来实现共享订阅功能, 要开始使用并了解有关 AWS 支持的 MQTT5 功能的更多信息,请参阅技术文档。