亚马逊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 功能的更多信息,请参阅技术文档

本篇作者

杨树铭

亚马逊云科技解决方案架构师,负责亚马逊云科技云计算方案咨询和设计。他与客户合作构建各类创新解决方案,帮助客户解决业务问题并快速使用 AWS 服务。熟悉 AWS IoT 平台的开发和使用,擅长数据分析、IoT 架构和管理,具有丰富的解决客户实际问题的经验。

曹阳

亚马逊云科技解决方案架构师,伦敦大学学院通信工程硕士,负责基于 AWS 云计算方案的架构咨询与设计,目前侧重于移动应用以及物联网领域的研究。