MQTT 如何处理发布者同时发布到同一主题?

问题描述 投票:0回答:2

假设我有 3 个出版商,A、B 和 C。

  • 发布者 A 向 SOME/TOPIC 发送消息 FOO、BAZ、SOMETHING
  • 发布者 B 向 SOME/TOPIC 发送消息 FOO, SOMETHING
  • 发布者 C 未向某些/主题发送消息

SOME/TOPIC 的订阅者会收到什么消息?

我想知道这一点的动机是发布者 A、B 和 C 正在从不可靠的数据源中提取这些消息,并且他们可能会错过一些消息,因此我有多个发布者发布到同一主题作为一种冗余形式。这是好主意还是坏主意?

mqtt mosquitto hivemq
2个回答
1
投票

订阅者将看到来自 A 和 B 的所有消息,它们传送给订阅者的顺序将取决于它们到达代理的顺序(这将取决于它们通常通过网络到达的顺序)以及某些经纪人的实施方式。

MQTT 代理规范没有提及如何处理多个相同的消息,因此会将它们视为任何其他消息,除非您选择创建自定义代理来执行不同的操作。

无论这是一个好主意还是不好,我们都无法回答,因为我们不知道订阅者收到多个相同消息(例如多个 FOO 和 SOMETHING 消息)的后果,因为消息在传递时不会包含任何内容有关哪个客户端发布它的信息(除非您选择在有效负载中对其进行编码)。


0
投票

“我有多个发布者发布到同一主题,作为一种冗余形式。这是好主意还是坏主意?”

如果您使用 QoS=2(仅一次交付),则会破坏语义,我认为这是一个坏主意。 QoS=0(最多一次)也不再成立,因为由于多个克隆发布者,数据被多次传送。 QoS=1 就可以了,我想...

...但是 MQTT 依赖于“可靠且有序的连接”——TCP 来命名它——而您的顺序现在未知。如果 A 和 B 都按该顺序发布 foo 和 bar,订阅者可能会看到:

  1. foo(A) 酒吧(A) foo(B) 酒吧(B)
  2. foo(B) foo(A) 酒吧(A) 酒吧(B)
  3. foo(A) bar(A) foo(B) (和 bar(B) 消息丢失,但这种情况很少见)

这听起来像是一个黑客解决方案,可能对您有用,但也可能导致订阅者方面出现奇怪的行为。

© www.soinside.com 2019 - 2024. All rights reserved.