MQTT特性 五:服務(wù)質(zhì)量水平(QoS)

在這篇文章中摆尝,解釋了 MQTT 中不同的服務(wù)質(zhì)量級(jí)別温艇。“服務(wù)質(zhì)量”這個(gè)詞在之前的文章中出現(xiàn)過(guò)幾次堕汞,讓我們來(lái)看看這個(gè)詞到底是什么意思勺爱。

正文

什么是服務(wù)質(zhì)量?
  • 服務(wù)質(zhì)量水平(QoS)是一個(gè)消息的發(fā)送者和限定遞送保證用于特定消息的消息的接收器之間的協(xié)議讯检。MQTT 中有 3 個(gè) QoS 級(jí)別:
    1.最多一次(0)
    2.至少一次(1)
    3.恰好一次(2)琐鲁。
    在 MQTT 中談 QoS 時(shí),需要考慮消息傳遞的兩個(gè)方面:
    1.消息從發(fā)布客戶(hù)端傳遞到代理人灼。
    2.從代理到訂閱客戶(hù)端的消息傳遞围段。
    我們將分別查看消息傳遞的兩個(gè)方面,因?yàn)閮烧咧g存在細(xì)微差別投放。向代理發(fā)布消息的客戶(hù)端在向代理發(fā)送消息時(shí)定義了消息的 QoS 級(jí)別奈泪。代理使用每個(gè)訂閱客戶(hù)端在訂閱過(guò)程中定義的 QoS 級(jí)別將此消息傳輸?shù)接嗛喛蛻?hù)端。如果訂閱客戶(hù)端定義的 QoS 低于發(fā)布客戶(hù)端灸芳,則代理會(huì)以較低的服務(wù)質(zhì)量傳輸消息涝桅。
為什么服務(wù)質(zhì)量很重要?
  • QoS 是 MQTT 協(xié)議的一個(gè)關(guān)鍵特性烙样。QoS 使客戶(hù)端能夠選擇與其網(wǎng)絡(luò)可靠性和應(yīng)用程序邏輯相匹配的服務(wù)級(jí)別冯遂。因?yàn)?MQTT 管理消息的重新傳輸并保證交付(即使底層傳輸不可靠),QoS 使不可靠網(wǎng)絡(luò)中的通信變得更加容易谒获。
它是如何工作的蛤肌?
  • 讓我們仔細(xì)看看每個(gè) QoS 級(jí)別在 MQTT 協(xié)議中是如何實(shí)現(xiàn)的壁却,以及它是如何運(yùn)作的:
  • QoS 0 - 最多一次 (服務(wù)質(zhì)量級(jí)別 0:最多交付一次)
    最低 QoS 級(jí)別為零。此服務(wù)級(jí)別可確保盡最大努力交付裸准。不保證交貨展东。接收方不會(huì)確認(rèn)收到消息,并且消息不會(huì)被發(fā)送方存儲(chǔ)和重新傳輸炒俱。QoS 級(jí)別 0 通常被稱(chēng)為“即發(fā)即忘”琅锻,并提供與底層 TCP 協(xié)議相同的保證。
image.png
  • QoS 1 - 至少一次 (服務(wù)質(zhì)量級(jí)別 1:至少交付一次)
    QoS 級(jí)別 1 保證消息至少傳遞一次給接收者向胡。發(fā)送方存儲(chǔ)消息,直到它從接收方收到確認(rèn)收到消息的 PUBACK數(shù)據(jù)包惊完。一條消息可以多次發(fā)送或傳遞僵芹。
image.png

發(fā)送方使用每個(gè)數(shù)據(jù)包中的數(shù)據(jù)包標(biāo)識(shí)符將 PUBLISH 數(shù)據(jù)包與相應(yīng)的 PUBACK 數(shù)據(jù)包進(jìn)行匹配。如果發(fā)送方在合理的時(shí)間內(nèi)沒(méi)有收到 PUBACK 數(shù)據(jù)包小槐,則發(fā)送方重新發(fā)送 PUBLISH 數(shù)據(jù)包拇派。當(dāng)接收者收到 QoS 1 的消息時(shí),它可以立即處理它凿跳。例如件豌,如果接收方是代理,則代理將消息發(fā)送給所有訂閱客戶(hù)端控嗜,然后回復(fù)一個(gè) PUBACK 數(shù)據(jù)包茧彤。

image.png

如果發(fā)布客戶(hù)端再次發(fā)送消息,它會(huì)設(shè)置重復(fù) (DUP) 標(biāo)志疆栏。在 QoS 1 中曾掂,此 DUP 標(biāo)志僅用于內(nèi)部目的,不由代理或客戶(hù)端處理壁顶。無(wú)論 DUP 標(biāo)志如何珠洗,消息的接收者都會(huì)發(fā)送 PUBACK。

  • QoS 2 - 恰好一次 (服務(wù)質(zhì)量級(jí)別 2:僅交付一次)
    QoS 2 是 MQTT 中最高級(jí)別的服務(wù)若专。此級(jí)別保證每條消息僅被預(yù)期收件人接收一次许蓖。QoS 2 是最安全、最慢的服務(wù)質(zhì)量級(jí)別调衰。該保證由發(fā)送方和接收方之間的至少兩個(gè)請(qǐng)求/響應(yīng)流(四部分握手)提供膊爪。發(fā)送方和接收方使用原始 PUBLISH 消息的數(shù)據(jù)包標(biāo)識(shí)符來(lái)協(xié)調(diào)消息的傳遞。
image.png

當(dāng)接收方從發(fā)送方獲得 QoS 2 PUBLISH 數(shù)據(jù)包時(shí)窖式,它會(huì)相應(yīng)地處理發(fā)布消息并使用PUBREC數(shù)據(jù)包回復(fù)發(fā)送方以確認(rèn) PUBLISH 數(shù)據(jù)包蚁飒。如果發(fā)送方?jīng)]有從接收方得到 PUBREC 數(shù)據(jù)包,它會(huì)再次發(fā)送帶有重復(fù) (DUP) 標(biāo)志的 PUBLISH 數(shù)據(jù)包萝喘,直到它收到確認(rèn)為止淮逻。

image.png

一旦發(fā)送方收到來(lái)自接收方的 PUBREC 數(shù)據(jù)包琼懊,發(fā)送方就可以安全地丟棄初始的 PUBLISH 數(shù)據(jù)包。發(fā)送方存儲(chǔ)來(lái)自接收方的 PUBREC 數(shù)據(jù)包爬早,并以PUBREL數(shù)據(jù)包進(jìn)行響應(yīng) 哼丈。

image.png

接收方得到PUBREL報(bào)文后,可以丟棄所有存儲(chǔ)的狀態(tài)筛严,用PUBCOMP報(bào)文應(yīng)答(發(fā)送方收到PUBCOMP報(bào)文也是如此)醉旦。在接收方完成處理并將 PUBCOMP 數(shù)據(jù)包發(fā)送回發(fā)送方之前,接收方存儲(chǔ)對(duì)原始 PUBLISH 數(shù)據(jù)包的數(shù)據(jù)包標(biāo)識(shí)符的引用桨啃。此步驟對(duì)于避免再次處理消息很重要车胡。發(fā)送方收到 PUBCOMP 數(shù)據(jù)包后,已發(fā)布消息的數(shù)據(jù)包標(biāo)識(shí)符可供重復(fù)使用照瘾。

![image.png](https://upload-images.jianshu.io/upload_images/23718996-22596a0da293faa9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

當(dāng) QoS 2 流完成時(shí)匈棘,雙方都確定消息已傳遞,并且發(fā)送方已確認(rèn)傳遞析命。
如果數(shù)據(jù)包在途中丟失主卫,則發(fā)送方有責(zé)任在合理的時(shí)間內(nèi)重新傳輸消息。如果發(fā)送方是 MQTT 客戶(hù)端或MQTT 代理則同樣如此鹃愤。接收方有責(zé)任相應(yīng)地響應(yīng)每個(gè)命令消息簇搅。

關(guān)于QoS
  • QoS 的某些方面乍一看并不是很明顯。當(dāng)您使用 QoS 時(shí)软吐,請(qǐng)記住以下幾點(diǎn):

  • QoS降級(jí)
    正如上文已經(jīng)提到瘩将,發(fā)送(發(fā)布)消息的客戶(hù)端和接收消息的客戶(hù)端之間的 QoS 定義和級(jí)別是兩件不同的事情。這兩種交互的 QoS 級(jí)別也可以不同关噪。向代理發(fā)送 PUBLISH 消息的客戶(hù)端定義消息的 QoS鸟蟹。但是,當(dāng)代理將消息傳遞給接收者(訂閱者)時(shí)使兔,代理使用接收者(訂閱者)在訂閱期間定義的 QoS建钥。例如,客戶(hù)端 A 是消息的發(fā)送者虐沥⌒芫客戶(hù)端 B 是消息的接收者。如果客戶(hù)端 B 以 QoS 1 訂閱代理并且客戶(hù)端 A 以 QoS 2 向代理發(fā)送消息欲险,則代理以 QoS 1 將消息傳遞給客戶(hù)端 B(接收者/訂閱者)镐依。消息可以多次傳遞給客戶(hù)端乙,

  • 每個(gè)客戶(hù)端的數(shù)據(jù)包標(biāo)識(shí)符是唯一的
    MQTT 用于 QoS 1 和 QoS 2 的數(shù)據(jù)包標(biāo)識(shí)符在交互中的特定客戶(hù)端和代理之間是唯一的天试。此標(biāo)識(shí)符在所有客戶(hù)端之間不是唯一的槐壳。一旦流完成,數(shù)據(jù)包標(biāo)識(shí)符就可以重新使用喜每。這種重用是包標(biāo)識(shí)符不需要超過(guò)65535的原因务唐■ㄈ粒客戶(hù)端可以在不完成交互的情況下發(fā)送超過(guò)這個(gè)數(shù)量的消息是不現(xiàn)實(shí)的。

最佳實(shí)踐
  • 我們經(jīng)常被問(wèn)到如何選擇正確的 QoS 級(jí)別的建議枫笛。以下是一些可以幫助您進(jìn)行決策的指南吨灭。適合您的 QoS 在很大程度上取決于您的用例。

當(dāng)……時(shí)使用 QoS 0

  • 您在發(fā)送方和接收方之間建立了完全或大部分穩(wěn)定的連接刑巧。QoS 0 的一個(gè)經(jīng)典用例是通過(guò)有線連接將測(cè)試客戶(hù)端或前端應(yīng)用程序連接到 MQTT 代理喧兄。
  • 不介意偶爾丟失幾條消息。如果數(shù)據(jù)不是那么重要或數(shù)據(jù)間隔很短啊楚,則某些消息的丟失是可以接受的
  • 不需要消息隊(duì)列吠冤。僅當(dāng)斷開(kāi)連接的客戶(hù)端具有 QoS 1 或 2 和持久會(huì)話時(shí),消息才會(huì)排隊(duì) 恭理。

當(dāng)……時(shí)使用 QoS 1

  • 需要獲取每條消息咨演,并且您的用例可以處理重復(fù)項(xiàng)。QoS 級(jí)別 1 是最常用的服務(wù)級(jí)別蚯斯,因?yàn)?strong>它保證消息至少到達(dá)一次,但允許多次傳遞饵较。當(dāng)然拍嵌,您的應(yīng)用程序必須容忍重復(fù)并能夠相應(yīng)地處理它們
  • 無(wú)法承受 QoS 2 的開(kāi)銷(xiāo)循诉。QoS 1 傳遞消息的速度比 QoS 2 快得多横辆。

當(dāng)……時(shí)使用 QoS 2

  • 一次接收所有消息對(duì)您的應(yīng)用程序至關(guān)重要。如果重復(fù)交付可能損害應(yīng)用程序用戶(hù)或訂閱客戶(hù)端茄猫,則通常會(huì)出現(xiàn)這種情況狈蚤。請(qǐng)注意開(kāi)銷(xiāo)以及 QoS 2 交互需要更多時(shí)間才能完成。

QoS 1 和 2 消息的排隊(duì)

  • 使用 QoS 1 和 2 發(fā)送的所有消息都會(huì)排隊(duì)等待離線客戶(hù)端划纽,直到客戶(hù)端再次可用脆侮。但是,這種排隊(duì)只有在客戶(hù)端具有持久會(huì)話時(shí)才有可能 勇劣。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末靖避,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子比默,更是在濱河造成了極大的恐慌幻捏,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件命咐,死亡現(xiàn)場(chǎng)離奇詭異篡九,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)醋奠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)榛臼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伊佃,“玉大人,你說(shuō)我怎么就攤上這事讽坏《В” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵路呜,是天一觀的道長(zhǎng)迷捧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)胀葱,這世上最難降的妖魔是什么漠秋? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮抵屿,結(jié)果婚禮上庆锦,老公的妹妹穿的比我還像新娘。我一直安慰自己轧葛,他們只是感情好搂抒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著尿扯,像睡著了一般求晶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衷笋,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天芳杏,我揣著相機(jī)與錄音,去河邊找鬼辟宗。 笑死爵赵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泊脐。 我是一名探鬼主播空幻,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼容客!你這毒婦竟也來(lái)了氛悬?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耘柱,失蹤者是張志新(化名)和其女友劉穎如捅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體调煎,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镜遣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悲关。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谎僻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寓辱,到底是詐尸還是另有隱情艘绍,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布秫筏,位于F島的核電站诱鞠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏这敬。R本人自食惡果不足惜航夺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崔涂。 院中可真熱鬧阳掐,春花似錦、人聲如沸冷蚂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蝙茶。三九已至涮俄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尸闸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工孕锄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吮廉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓畸肆,卻偏偏與公主長(zhǎng)得像宦芦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子轴脐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容