MQTT协议学习笔记——Qos深入分析

1、简单介绍

(1)所谓的“Qos”——“quality of service”,即 “质量服务”。

质量:通讯质量,即 “消息的可靠性”。
服务:保证消息可靠的机制。

(2)Qos等级

Qos=0,发送者最多发送一次消息(最多一次);

Qos=1,发送者最少发送一次消息,即接收者可能会收到同一条消息好几次(最少一次);

Qos=2,发送者发送一次“被接收者接收一次“的消息(有且只有一次)。

2、深入思考

(1)Qos=0

发送者只发送一次消息,不进行重试,不关心消息是否已经投递到了接收者那边。Broker不会返回确认消息。在Qos0情况下,Broker可能没有接受到消息。适合那些不是很重要的数据。

(2)Qos=2

发送者最少发送一次消息,确保消息到达Broker,Broker需要返回确认消息PUBACK。在Qos1情况下,Broker可能接受到重复消息。尽管我们可以通过确认来保证一定收到客户端或服务器的message,但是我们却不能保证message仅有一次,也就是当client没收到service的puback或者service没有收到client的puback,那么就会一直发送publisher。

流程:(publisher -> broker)

  1. publisher store msg -> publish ->broker (传递message)
  2. broker -> puback -> publisher delete msg (确认传递成功)

注意:

  1. publisher必须保存msg,这样才能在重发
  2. publisher如果在一定时间或socket断开等异常情况,会继续重发msg

(3)Qos=2

Qos2使用两阶段确认来保证消息的不丢失和不重复。在Qos2情况下,Broker肯定会收到消息,且只收到一次。

主要过程:publisher和broker进行了缓存,其中publisher缓存了message和msgID,而broker缓存了msgID,两方都做记录所以可以保证消息不重复,但是由于记录是需要删除的,这个删除流程同样多了一倍。

与Qos1相比,Qos2的开销会很大,因为Broker有额外的两个动作:

   *去重。为了保证消息不重复,Broker必须进行去重处理;
   * 确保响应消息PUBREC到达客户端。Broker必须等待客户端对PUBREC消息的响应PUBREL,只有收到客户端的确认消息后,Broker才能对订阅者投递消息。

(4)总结

QoS 级别越高,流程越复杂,系统资源消耗越大。应用程序可以根据自己的网络场景和业务需求,选择合适的 QoS 级别;

大部分情况下使用Qos=0或Qos=1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章