乐趣区

关于mqtt:订阅标识符与订阅选项-MQTT-50-新特性

MQTT v5 带来了很多新的个性,咱们会尽量以通俗易懂的形式展现这些个性,并探讨这些个性对开发者的影响。到目前为止,咱们曾经探讨过这些 MQTT v5 新个性,明天咱们将持续探讨:订阅标识符 订阅选项

订阅标识符

客户端能够在订阅时指定一个订阅标识符,服务端将在订阅胜利创立或批改时建设并存储该订阅与订阅标识符的映射关系。当有匹配该订阅的 PUBLISH 报文要转发给此客户端时,服务端会将与该订阅关联的订阅标识符随 PUBLISH 报文一并返回给客户端。

因而,客户端能够建设订阅标识符与音讯处理程序的映射,以在收到 PUBLISH 报文时间接通过订阅标识符将音讯定向至对应的音讯处理程序,这会远远快于通过主题匹配来查找音讯处理程序的速度。

因为 SUBSCRIBE 报文反对蕴含多个订阅,因而可能呈现多个订阅关联到同一个订阅标识符的状况。即使是离开订阅,也可能呈现这种状况,但这是被容许的,只是用户该当意识到这样应用可能引起的结果。依据客户端的理论订阅状况,最终客户端收到的 PUBLISH 报文中可能蕴含多个订阅标识符,这些标识符可能齐全不同,也可能有些是雷同的,以下是几种常见的状况:

  1. 客户端订阅主题 a 并指定订阅标识符为 1,订阅主题 b 并指定订阅标识符为 2。因为应用了不同的订阅标识符,主题为 ab 的音讯可能被定向至不同的音讯处理程序。
  2. 客户端订阅主题 a 并指定订阅标识符为 1,订阅主题 b 并指定订阅标识符为 1。因为应用了雷同的订阅标识符,主题为 ab 的音讯都将被定向至同一个音讯处理程序。
  3. 客户端订阅主题 a/+ 并指定订阅标识符为 1,订阅主题a/b 并指定订阅标识符为 1。主题为 a/b 的 PUBLISH 报文将会携带两个雷同的订阅标识符,对应的音讯处理程序将被触发两次。
  4. 客户端订阅主题 a/+ 并指定订阅标识符为 1,订阅主题a/b 并指定订阅标识符为 2。主题为 a/b 的 PUBLISH 报文将会携带两个不同的订阅标识符,一个音讯将触发两个不同的音讯处理程序。

这种 PUBLISH 报文中携带多个订阅标识符的状况,在音讯速率低的时候通常不成问题,但在音讯速率高时可能会引发一些性能问题,因而咱们建议您尽量确保这种状况的呈现都是您无意为之。

订阅选项

在 MQTT v5 中,你能够应用更多的订阅选项来扭转服务端的行为。

QoS

参见 MQTT 音讯服务质量等级。

No Local

在 MQTT v3.1.1 中,如果你订阅了本人公布音讯的主题,那么你将收到本人公布的所有音讯。

而在 MQTT v5 中,如果你在订阅时将此选项设置为 1,那么服务端将不会向你转发你本人公布的音讯。

Retain As Publish

这一选项用来指定服务端向客户端转发音讯时是否要保留其中的 RETAIN 标识,留神这一选项不会影响保留音讯中的 RETAIN 标识。因而当 Retain As Publish 选项被设置为 0 时,客户端间接依附音讯中的 RETAIN 标识来辨别这是一个失常的转发音讯还是一个保留音讯,而不是去判断音讯是否是本人订阅后收到的第一个音讯(转发音讯甚至可能会先于保留音讯被发送,视不同 Broker 的具体实现而定)。

Retain Handling

这一选项用来指定订阅建设时服务端是否向客户端发送保留音讯:

  • Retain Handling 等于 0,只有客户端订阅胜利,服务端就发送保留音讯。
  • Retain Handling 等于 1,客户端订阅胜利且该订阅此前不存在,服务端才发送保留音讯。毕竟有些时候客户端从新发动订阅可能只是为了扭转一下 QoS,并不意味着它想再次接管保留音讯。
  • Retain Handling 等于 2,即使客户订阅胜利,服务端也不会发送保留音讯。

版权申明:本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.io/cn/blog/s…

退出移动版