19

我是 MQTT 新手,刚刚了解了发布消息时决定的 QOS 级别的含义:

  • 0当我们希望消息根本不会到达而不是到达两次时
  • 1当我们希望消息至少到达一次但不关心它是否到达两次(或更多)时
  • 2当我们希望消息只到达一次时。较高的 QOS 值意味着较慢的传输

我注意到订阅方还可以设置“他们将收到的最大 QOS 级别”。从这里引用:

例如,如果一条消息以 QoS 2 发布,而客户端订阅的 QoS 为 0,则该消息将传递给 QoS 0 的客户端。

这是否意味着尽管发布者使用 QOS 2 发送消息,但消息可能无法到达客户端(QOS 0)?

这对于没有经验的开发者来说可能是个大问题——例如,npm mqtt 包中 subscribe 功能的默认 QOS为 0!(在我看来,默认应该是最大值2,即“让发布者决定QOS”)。

4

4 回答 4

16

你是对的,不能保证在 QoS 2 发布的消息会到达使用 QoS 0 的订阅者。如果该订阅者接收消息很重要,他们应该使用 QoS 1 或 2。就是这样决定任何给定的应用程序。

我会将您对 QoS 0 的定义重写为“最多一次”,即消息将被接收或不会被接收,没有重复的机会。

关于默认 QoS - 我认为大多数客户端使用 QoS 0 作为默认值。我认为将 QoS 1 或 2 设置为默认值不会对没有经验的开发人员有所帮助,他们仍然需要了解他们在做什么以及他们在做什么,并考虑对他们的应用程序的影响。

于 2015-11-02T15:24:32.143 回答
4

发布者实际上并没有直接了解哪些客户订阅了该消息。发布者的 QOS 级别决定了确保代理接收发布的服务质量。一旦代理接收到发布,它就负责以相应订阅者选择的 QOS 将消息重新发送给每个订阅者。即使发布者将消息发送到 QOS 0 或 1 的代理,订阅者也可以在 QOS 2 接收消息。

我发现这篇文章对理解这个概念很有帮助。

于 2020-10-28T19:13:34.560 回答
2

“这是否意味着尽管发布者使用 QOS 2 发送消息,但消息可能无法到达客户端 (QOS 0)?”

是的,这是真的。发布者希望在 QOS 2 上发布,以确保记录仅到达状态层一次(没有重复)。一层重试+确认用于确保这一点。为订阅客户端提供主题的代理还有其他工作,以确保消息在请求的 QOS 级别上传递。

例如,一条消息在 QOS 1 发布,而同一主题的订阅者在 QOS 2 订阅,那么处理向所述订阅者传递消息的代理将必须确保没有重复发送给客户端。

在您的示例中,发布者在 QOS 2 发布,因此状态层插入了一次记录,并且同一主题在 QOS 0 处有订阅者。订阅者可能永远不会收到此消息。例如,在消息发送过程中,网络出现了故障,并且记录从未到达。由于 QOS 0 中没有 ack 机制,因此代理永远不会尝试重新传递。

于 2020-06-11T15:36:47.107 回答
-3

我还没有阅读 MQTT 协议规范,只是说我对 mosquitto 1.5.3 的测试。

1. 运行 mosquitto 服务器/代理

使用默认配置。

mosquitto -v

1541075091: mosquitto version 1.5.3 starting
1541075091: Using default config.

2. 发布测试消息

AAA sub topic 'aaa'
BBB sub topic '+'
DDD pub topic 'aaa'

3.服务器标准输出

1541075322: New connection from 10.1.1.159 on port 1883.
1541075322: New client connected from 10.1.1.159 as DDD (c1, k60).
1541075322: No will message specified.

1541075322: Sending CONNACK to DDD (0, 0)
1541075322: Received PUBLISH from DDD (d0, q1, r1, m1, 'aaa', ... (8 bytes))
1541075322: Sending PUBACK to DDD (Mid: 1)

1541075322: Sending PUBLISH to AAA (d0, q0, r0, m0, 'aaa', ... (8 bytes))
1541075322: Sending PUBLISH to BBB (d0, q0, r0, m0, 'aaa', ... (8 bytes))
1541075322: Received DISCONNECT from DDD
1541075322: Client DDD disconnected.

服务器PUBACK到 DDD 之前PUBLISH的消息。

4. 所以我猜

pub qos=1只确保经纪人收到了味精,
sub qos也:

[ pub ] ---pub_qos---> [ broker ] ---sub_qos--> [ sub ]

// MQTT 客户端和代理网络拓扑为星形网络。
// 如果我有时间,我会阅读协议规范

于 2018-10-31T12:47:31.780 回答