共享订阅

共享订阅是 MQTT 5.0 引入的一个重要功能,目前它已经广泛地应用在生产实践中。虽然这是 MQTT 5.0 的一个新特性,但任何协议版本的客户端都能使用它,臻云消息服务也是在MQTT3.1.1版本的协议基础上实现了完全兼容MQTT5.0的共享订阅

什么是共享订阅

在普通的订阅中,我们每发布一条消息,所有匹配的订阅端都会收到该消息的副本。当某个订阅端的消费速度无法跟上消息的生产速度时,我们没有办法将其中一部分消息分流到其他订阅端中来分担压力。这使订阅端容易成为整个消息系统的性能瓶颈。

所以 MQTT 5.0 引入了共享订阅特性,它使得 MQTT 服务端可以在使用特定订阅的客户端之间均衡地分配消息负载。这表示,当我们有两个客户端共享一个订阅时,那么每个匹配该订阅的消息都只会有一个副本投递给其中一个客户端。

共享订阅不仅为消费端带来了极佳的水平扩展能力,使我们可以应对更高的吞吐量,还为其带来了高可用性,即使共享订阅组中的一个客户端断开连接或发生故障,其他客户端仍然可以继续处理消息,在必要时还可以接管原先流向该客户端的消息流。

如何使用共享订阅

使用共享订阅,我们不需要对客户端的底层代码进行任何改动,只需要在订阅时使用遵循以下命名规范的主题即可:

$share/{Share Name}/{Topic Filter}

其中$share是一个固定的前缀,以便服务端知道这是一个共享订阅主题。{Topic Filter} 则是我们实际想要订阅的主题。

中间的 {Share Name} 是一个由客户端指定的字符串,表示当前共享订阅使用的共享名。很多时候{Share Name} 这个字段也会被叫作 Group Name 或者 Group ID,这确实会更容易理解一些。

需要共享同一个订阅的一组订阅会话,必须使用相同的共享名。但是,两个订阅的共享名 {Share Name} 相同,并不表示它们一定是相同的共享订阅。只有 {Share Name}/{Topic Filter} 才能唯一地标识一个共享订阅组。

共享订阅和普通订阅互不影响,当某个消息同时与共享订阅和普通订阅匹配时,服务端会向每个匹配的普通订阅的客户端发送该消息的副本,同时向每个匹配的共享订阅组中的其中一个会话发送该消息的副本。如果这些订阅来自同一个客户端,那么这个客户端可能会收到该消息的多个副本。

共享订阅的负载均衡策略

共享订阅的核心在于服务端如何在客户端之间分配消息负载,臻云消息服务一共实现了4种负载均衡策略:

  • 随机(Random):在共享订阅组内随机选择一个会话发送消息。
  • 轮询(Round Robin):在共享订阅组内按顺序选择一个会话发送消息,循环往复。
  • 哈希主题(Hash Topic):按消息Topic的哈希结果来分发。
  • 哈希设备序列号(Hash SN):按消息Topic内的SN的哈希结果来分发。

具体的使用方式是,将${负载均衡策略}_${共享订阅名称}一同作为{Share Name},如下:

  • 随机策略订阅设备消息:$share/random_group1/device/+/message/up/+
  • 轮询策略订阅设备消息:$share/roundrobin_group1/device/+/message/up/+
  • 哈希主题策略订阅设备消息:$share/hashtopic_group1/device/+/message/up/+
  • 哈希设备序列号策略订阅设备消息:$share/hashsn_group1/device/+/message/up/+

results matching ""

    No results matching ""