MQTT 客户机提供的服务质量
MQTT 客户机提供了三种服务质量,可用于向 IBM® MQ 和 MQTT 客户机提供发布内容:“至多一次”、“至少一次”以及“刚好一次”。 当 MQTT 客户机向 IBM MQ 发送请求以创建预订时,将以 "至少一次" 服务质量发送该请求。
发布的服务质量是 MqttMessage 的一种属性。 它是由 MqttMessage.setQos 方法设置的。
MqttClient.subscribe 方法可以降低应用于向客户机发送的、针对某个主题的发布的服务质量。 转发至订户的发布的服务质量可能不同于该发布的服务质量。 转发发布时,将使用这两个值当中的较小者。
- 至多一次
QoS=0- 至多传递一次消息,或者根本就不传递消息。 不会确认通过网络来传递此消息。
- 不存储此消息。 如果客户机断开连接或者服务器失败,那么消息可能会丢失。
QoS=0是最快传递方式。 有时候将它称为“发出消息之后无需等待应答”。- MQTT protocol 不需要服务器将
QoS=0上的发布转发到客户机。 如果在服务器接收发布时客户机已断开连接,那么根据服务器,可能会废弃此发布。 遥测 (MQXR) 服务不会废弃使用QoS=0发送的消息。 它们存储为非持久消息,且只有当队列管理器停止运行时才被废弃。
- 至少一次
-
QoS=1QoS=1是缺省传递方式。- 始终会至少传递一次消息。 如果发送方未接收到确认信息,那么会在设置了 DUP 标志的情况下再次发送此消息,直到接收到确认信息为止。 因此,接收方可以多次发送同一消息,并且可以多次处理此消息。
- 必须将消息存储在发送方和接收方本地,直到已处理此消息为止。
- 在接收方已处理消息之后,就会从接收方删除此消息。 如果接收方是一个代理,那么会将消息发布至它的订户。 如果接收方是客户机,那么会将消息传递至订户应用程序。 删除消息之后,接收方会向发送方发送确认信息。
- 在发送方接收到来自接收方的确认信息之后,就会从发送方删除此消息。
- 刚好一次
QoS=2- 始终刚好传递一次消息。
- 必须将消息存储在发送方和接收方本地,直到已处理此消息为止。
QoS=2是最安全、但是最慢的传递方式。 从发送方删除消息之前,此方式在发送方与接收方之间至少采用两对传输。 在第一次传输之后,可以在接收方处理消息。- 在第一对传输中,发送方将传输消息,并从它已将消息存储于的接收方获取确认信息。 如果发送方未接收到确认信息,那么会在设置了 DUP 标志的情况下再次发送此消息,直到接收到确认信息为止。
- 在第二对传输中,发送方告诉接收方它可以完成对消息
的处理。 如果发送方未收到对PUBREL
消息的确认,那么将再次发送PUBREL
消息,直到接收到确认为止。 发送方在收到对PUBREL
消息的确认时删除它保存的消息PUBREL
- 如果接收方不重新处理消息,那么接收方可以在第一阶段或者第二阶段处理此消息。 如果接收方是一个代理,那么它会将消息发布至订户。 如果接收方是客户机,那么它会将消息传递至订户应用程序。 接收方会将一条完成消息发送回发送方,指出它已经完成了处理此消息。