MQTT 入門(3)--MQTT QoS 詳解

来源:https://www.cnblogs.com/wuyongyin/archive/2022/06/05/16178060.html
-Advertisement-
Play Games

目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...


本文主要介紹 MQTT 協議中 QoS(服務質量) 的詳細內容。

1、概述

MQTT 協議 中規定了消息服務質量(Quality of Service),它保證了在不同的網路環境下消息傳遞的可靠性,QoS 的設計是 MQTT 協議里的重點。作為專為物聯網場景設計的協議,MQTT 的運行場景不僅僅是 PC,而是更廣泛的窄帶寬網路和低功耗設備,如果能在協議層解決傳輸質量的問題,將為物聯網應用的開發提供極大便利。

2、MQTT QoS 等級

MQTT 設計了 3 個 QoS 等級。

  • QoS 0:消息最多傳遞一次,如果當時客戶端不可用,則會丟失該消息。
  • QoS 1:消息傳遞至少 1 次。
  • QoS 2:消息僅傳送一次。

QoS 0 是一種 "fire and forget" 的消息發送模式:Sender (可能是 Publisher 或者 Broker) 發送一條消息之後,就不再關心它有沒有發送到對方,也不設置任何重發機制。

QoS 1 包含了簡單的重發機制,Sender 發送消息之後等待接收者的 ACK,如果沒收到 ACK 則重新發送消息。這種模式能保證消息至少能到達一次,但無法保證消息重覆。

QoS 2 設計了重發和重覆消息發現機制,保證消息到達對方並且嚴格只到達一次。

3、QoS 工作原理

QoS 0 - 最多分發一次

當 QoS 為 0 時,消息的分發依賴於底層網路的能力。發佈者只會發佈一次消息,接收者不會應答消息,發佈者也不會儲存和重發消息。消息在這個等級下具有最高的傳輸效率,但可能送達一次也可能根本沒送達。

Qos 1 - 至少分發一次

當 QoS 為 1 時,可以保證消息至少送達一次。MQTT 通過簡單的 ACK 機制來保證 QoS 1。發佈者會發佈消息,並等待接收者的 PUBACK 報文的應答,如果在規定的時間內沒有收到 PUBACK 的應答,發佈者會將消息的 DUP 置為 1 並重發消息。接收者接收到 QoS 為 1 的消息時應該回應 PUBACK 報文,接收者可能會多次接受同一個消息,無論 DUP 標誌如何,接收者都會將收到的消息當作一個新的消息併發送 PUBACK 報文應答。

 

QoS 2 - 只分發一次

當 QoS 為 2 時,發佈者和訂閱者通過兩次會話來保證消息只被傳遞一次,這是最高等級的服務質量,消息丟失和重覆都是不可接受的。使用這個服務質量等級會有額外的開銷。

發佈者發佈 QoS 為 2 的消息之後,會將發佈的消息儲存起來並等待接收者回覆 PUBREC 的消息,發送者收到 PUBREC 消息後,它就可以安全丟棄掉之前的發佈消息,因為它已經知道接收者成功收到了消息。發佈者會保存 PUBREC 消息並應答一個 PUBREL,等待接收者回覆 PUBCOMP 消息,當發送者收到 PUBCOMP 消息之後會清空之前所保存的狀態。

當接收者接收到一條 QoS 為 2 的 PUBLISH 消息時,他會處理此消息並返回一條 PUBREC 進行應答。當接收者收到 PUBREL 消息之後,它會丟棄掉所有已保存的狀態,並回覆 PUBCOMP。

無論在傳輸過程中何時出現丟包,發送端都負責重發上一條消息。不管發送端是 Publisher 還是 Broker,都是如此。因此,接收端也需要對每一條命令消息都進行應答。

 

 

 

4、QoS 在發佈與訂閱中的區別

MQTT 發佈與訂閱操作中的 QoS 代表了不同的含義,發佈時的 QoS 表示消息發送到服務端時使用的 QoS,訂閱時的 QoS 表示服務端向自己轉發消息時可以使用的最大 QoS。

  • 當客戶端 A 的發佈 QoS 大於客戶端 B 的訂閱 QoS 時,服務端向客戶端 B 轉發消息時使用的 QoS 為客戶端 B 的訂閱 QoS。
  • 當客戶端 A 的發佈 QoS 小於客戶端 B 的訂閱 QoS 時,服務端向客戶端 B 轉發消息時使用的 QoS 為客戶端 A 的發佈 QoS。

不同情況下客戶端收到的消息 QoS 可參考下表:

發佈消息的 QoS主題訂閱的 QoS接收消息的 QoS
0 0 0
0 1 0
0 2 0
1 0 0
1 1 1
1 2 1
2 0 0
2 1 1
2 2 2

5、如何選擇 MQTT QoS 等級

QoS 級別越高,流程越複雜,系統資源消耗越大。應用程式可以根據自己的網路場景和業務需求,選擇合適的 QoS 級別。

以下情況下可以選擇 QoS 0

  • 可以接受消息偶爾丟失。
  • 在同一個子網內部的服務間的消息交互,或其他客戶端與服務端網路非常穩定的場景。

以下情況下可以選擇 QoS 1

  • 對系統資源消耗較為關註,希望性能最優化。
  • 消息不能丟失,但能接受並處理重覆的消息。

以下情況下可以選擇 QoS 2

  • 不能忍受消息丟失(消息的丟失會造成生命或財產的損失),且不希望收到重覆的消息。
  • 數據完整性與及時性要求較高的銀行、消防、航空等行業。

 

 

參考:https://www.emqx.com/zh/blog/introduction-to-mqtt-qos


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 兩個特性說明Dapr是比SpringCloud和Istio更有前途的微服務開發框架。 ...
  • 從本篇文章開始,筆者打算寫一個系列的《clickhouse專欄》,其全稱是Click Stream,Data WareHouse,簡稱ClickHouse。從其全稱中的“Data WareHouse”,我們可以看出clickhouse的定位是數據倉庫。那麼“數據倉庫”和“資料庫”有什麼區別呢?理解這 ...
  • 1 與其它協程庫使用對比 這個 C 協程庫是雲風(cloudwu) 寫的,其介面風格與 Lua 協程類似,並且都是非對稱 stackful 協程。這個是源代碼中的示例: #include "coroutine.h" #include <stdio.h> struct args { int n; }; ...
  • #結構 ##順序結構 JAVA的基本結構就是順序結構,除非特意指明,否則就按照順序,一句一句執行。 順序結構是最簡單的演算法結構 語句與語句之間,框與框之間按照從上到下的順序執行,它是任何演算法都離不開的基本演算法結構 ##選擇結構 if單選擇結構 if雙選擇結構 if多選擇結構 嵌套的if結構 swit ...
  • 項目環境docker及docker-compose文檔 1、Linux環境介紹 centos7.6 16G以上記憶體空間(至少8G) 2、靜態IP設置 1、找到配置文件 cd /etc/sysconfig/network-scripts/ vi ifcfg-ens33 TYPE=EthernetPRO ...
  • 前面我們分析了攜程的 apollo(見 詳解apollo的設計與使用),現在再來看看阿裡的 nacos。和 apollo 一樣,nacos 也是一款配置中心,同樣可以實現配置的集中管理、分環境管理、即時生效等等。不過,nacos 還具備了服務發現的功能。這篇博客將重點分析 nacos 和 apoll... ...
  • 關註「WeiyiGeek」點我,點我 設為「特別關註」,每天帶你在B站玩轉網路安全運維、應用開發、物聯網IOT學習! 希望各位看友【關註、點贊、評論、收藏、投幣】,助力每一個夢想。 文章目錄 0x00 快速瞭解 EasyOCR 介紹 EasyOCR 參考來源 0x01 安裝部署 環境依賴 環境安裝 ...
  • Markdown語法學習筆記 {#Top} 寫在前面:本篇筆記僅記錄學習後的總結,以供日後快速回顧使用。 更多擴展語法參考Markdown官網 標題上設置了錨點鏈接 # Markdown語法學習筆記 {#Top} 緊接著下方設置了生成索引目錄 1. 標題 Markdown 語法 HTML 預覽效果 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...