MQTT (Paho) 中的订阅会发生冲突吗?
Can subscriptions clash in MQTT (Paho)?
我对 Paho 中的订阅以及应用程序如何管理不同主题(允许使用通配符)有疑问。我们很感兴趣,因为我们提供了一个层来管理所有这些东西,以简化开发人员的生活,因此我们以后可以根据需要在幕后使用非 MQTT pub/sub。
一个例子可能是最好的解释方式。假设我们的程序中有两个独立的模块:
get_all_info()
订阅主题 fleet/vehicle-N/#
的 短 时间以获取特定车辆的所有信息 N
.
speed_mon()
,只对所有车辆的速度感兴趣,在节目期间订阅了 fleet/+/speed
。
考虑序列(a):
speed_mon()
订阅 fleet/+/speed
.
get_all_info()
订阅 fleet/vehicle-17/#
并获取信息。
get_all_info()
取消订阅 fleet/vehicle-17/#
。
第三次操作会影响第一次吗?换句话说,我们还会收到主题为 fleet/vehicle-17/speed
的消息吗?
如果取消订阅是对特定 订阅的简单逆转,它将仅禁用在第二个要点中创建的订阅。
如果它使用过滤器禁用所有 匹配的 订阅(在通配符意义上),它也会影响第一个订阅。
(a) 现在忽略这样一个事实,即我们最好在节目期间 get_all_info()
订阅 fleet/#
而永远不会取消订阅,而只是将消息缓存到本地存储中。这是一个人为的例子。我们无法控制 客户端将如何使用我们的层。
我相信 MQTT 规范对此非常清楚。 v3 and v5 文本类似; v3 状态:
The Topic Filters (whether they contain wildcards or not) supplied in an UNSUBSCRIBE packet MUST be compared character-by-character with the current set of Topic Filters held by the Server for the Client. If any filter matches exactly then its owning Subscription is deleted, otherwise no additional processing occurs [MQTT-3.10.4-1].
原来是逐字比较;取消订阅 fleet/vehicle-17/#
不会影响订阅 fleet/+/speed
.
请注意,在将传入消息映射到回调时,某些库可能无法正确实现这一点(go 库用于 have this wrong)。
也许更有趣的问题是(你没有问这个但可能有影响):
If I'm subscribed to both fleet/+/speed
and fleet/vehicle-17/#
will I get multiple copies of messages on the fleet/vehicle-17/speed
topic.
此处的行为更受 v3 中实现细节的影响 (spec) but clearly defined in v5 due to the introduction of subscription identifiers (spec)。
我对 Paho 中的订阅以及应用程序如何管理不同主题(允许使用通配符)有疑问。我们很感兴趣,因为我们提供了一个层来管理所有这些东西,以简化开发人员的生活,因此我们以后可以根据需要在幕后使用非 MQTT pub/sub。
一个例子可能是最好的解释方式。假设我们的程序中有两个独立的模块:
get_all_info()
订阅主题fleet/vehicle-N/#
的 短 时间以获取特定车辆的所有信息N
.speed_mon()
,只对所有车辆的速度感兴趣,在节目期间订阅了fleet/+/speed
。
考虑序列(a):
speed_mon()
订阅fleet/+/speed
.get_all_info()
订阅fleet/vehicle-17/#
并获取信息。get_all_info()
取消订阅fleet/vehicle-17/#
。
第三次操作会影响第一次吗?换句话说,我们还会收到主题为 fleet/vehicle-17/speed
的消息吗?
如果取消订阅是对特定 订阅的简单逆转,它将仅禁用在第二个要点中创建的订阅。
如果它使用过滤器禁用所有 匹配的 订阅(在通配符意义上),它也会影响第一个订阅。
(a) 现在忽略这样一个事实,即我们最好在节目期间 get_all_info()
订阅 fleet/#
而永远不会取消订阅,而只是将消息缓存到本地存储中。这是一个人为的例子。我们无法控制 客户端将如何使用我们的层。
我相信 MQTT 规范对此非常清楚。 v3 and v5 文本类似; v3 状态:
The Topic Filters (whether they contain wildcards or not) supplied in an UNSUBSCRIBE packet MUST be compared character-by-character with the current set of Topic Filters held by the Server for the Client. If any filter matches exactly then its owning Subscription is deleted, otherwise no additional processing occurs [MQTT-3.10.4-1].
原来是逐字比较;取消订阅 fleet/vehicle-17/#
不会影响订阅 fleet/+/speed
.
请注意,在将传入消息映射到回调时,某些库可能无法正确实现这一点(go 库用于 have this wrong)。
也许更有趣的问题是(你没有问这个但可能有影响):
If I'm subscribed to both
fleet/+/speed
andfleet/vehicle-17/#
will I get multiple copies of messages on thefleet/vehicle-17/speed
topic.
此处的行为更受 v3 中实现细节的影响 (spec) but clearly defined in v5 due to the introduction of subscription identifiers (spec)。