国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MQTT 持久會話 vs. Clean Session內(nèi)幕一網(wǎng)打盡

這篇具有很好參考價(jià)值的文章主要介紹了MQTT 持久會話 vs. Clean Session內(nèi)幕一網(wǎng)打盡。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1 前言

  • 不穩(wěn)定的網(wǎng)絡(luò)
  • 有限的硬件資源

物聯(lián)網(wǎng)應(yīng)用兩大難題,MQTT 客戶端與服務(wù)器的連接可能隨時(shí)因網(wǎng)絡(luò)波動(dòng)及資源限制而異常斷開。為解決網(wǎng)絡(luò)連接斷開對通信造成的影響,MQTT 協(xié)議提供持久會話功能。

MQTT 客戶端在發(fā)起到服務(wù)器的連接時(shí),可設(shè)置是否創(chuàng)建一個(gè)持久會話。持久會話會保存一些重要數(shù)據(jù),以使會話能在多個(gè)網(wǎng)絡(luò)連接中繼續(xù)。

2 作用

  • 避免因網(wǎng)絡(luò)中斷導(dǎo)致需要反復(fù)訂閱帶來的額外開銷
  • 避免錯(cuò)過離線期間的消息
  • 確保 QoS 1 和 QoS 2 的消息質(zhì)量保證不被網(wǎng)絡(luò)中斷影響

3 持久會話需存儲哪些數(shù)據(jù)?

通過上文我們知道持久會話需要存儲一些重要的數(shù)據(jù),以使會話能被恢復(fù)。這些數(shù)據(jù)有的存儲在客戶端,有的則存儲在服務(wù)端。

客戶端中存儲的會話數(shù)據(jù):

  • 已發(fā)送給服務(wù)端,但是還沒有完成確認(rèn)的 QoS 1 與 QoS 2 消息
  • 從服務(wù)端收到的,但是還沒有完成確認(rèn)的 QoS 2 消息

服務(wù)端中存儲的會話數(shù)據(jù):

  • 會話是否存在,即使會話狀態(tài)其余部分為空。
  • 已發(fā)送給客戶端,但是還沒有完成確認(rèn)的 QoS 1 與 QoS 2 消息。
  • 等待傳輸給客戶端的 QoS 0 消息(可選),QoS 1 與 QoS 2 消息。
  • 從客戶端收到的,但是還沒有完成確認(rèn)的 QoS 2 消息,遺囑消息和遺囑延時(shí)間隔。

4 MQTT Clean Session

控制會話狀態(tài)生命周期的標(biāo)志位:

  • true 表示創(chuàng)建一個(gè)新的會話,在客戶端斷開連接時(shí),會話將自動(dòng)銷毀
  • false 表示創(chuàng)建一個(gè)持久會話,在客戶端斷開連接后會話仍然保持,直到會話超時(shí)注銷

持久會話能被恢復(fù)的前提是客戶端使用固定 Client ID 再連,如 Client ID 動(dòng)態(tài),連接成功后將會創(chuàng)建一個(gè)新的持久會話。

如下Dashboard,圖中連接雖然是斷開狀態(tài),但因是持久會話,仍能被查看到,且可在 Dashboard 中手動(dòng)清除該會話:

MQTT 持久會話 vs. Clean Session內(nèi)幕一網(wǎng)打盡

EMQX 也支持在 Dashboard 設(shè)置 Session 相關(guān)參數(shù)。

MQTT 持久會話 vs. Clean Session內(nèi)幕一網(wǎng)打盡

MQTT 3.1.1 沒規(guī)定持久會話何時(shí)過期,僅從協(xié)議層理解,這持久會話應(yīng)永久存在。但實(shí)際場景不現(xiàn)實(shí),因?yàn)樗浅U挤?wù)端資源,所以服務(wù)端實(shí)際向用戶提供一個(gè)全局配置來限制會話過期時(shí)間。如設(shè)置會話過期時(shí)間 5 min,最大消息數(shù)為 1000 條,且不保存 QoS 0 消息。

5 使用

打開 MQTTX 后如下所示,點(diǎn)擊 New Connection 按鈕創(chuàng)建一個(gè) [MQTT 連接]。

MQTT 持久會話 vs. Clean Session內(nèi)幕一網(wǎng)打盡

創(chuàng)建名為 MQTT_V3 的連接,Clean Session 為關(guān)閉狀態(tài)(即為 false),MQTT 版本選擇 3.1.1,然后點(diǎn)擊右上角的 Connect 按鈕。

MQTT 持久會話 vs. Clean Session內(nèi)幕一網(wǎng)打盡

連接成功后訂閱 clean_session_false 主題,且 QoS 設(shè)置為 1。

MQTT 持久會話 vs. Clean Session內(nèi)幕一網(wǎng)打盡

訂閱成功后,點(diǎn)擊右上角的斷開連接按鈕。然后,創(chuàng)建一個(gè)名為 MQTT_V3_Publish 的連接,MQTT 版本同樣設(shè)置為 3.1.1,連接成功后向 clean_session_false 主題發(fā)布兩條 QoS 1 消息。

MQTT 持久會話 vs. Clean Session內(nèi)幕一網(wǎng)打盡

然后選中 MQTT_V3 連接,點(diǎn)擊連接按鈕連接至服務(wù)器,將會成功接收到兩條離線期間的消息。

MQTT 持久會話 vs. Clean Session內(nèi)幕一網(wǎng)打盡

6 MQTT 5.0 中的會話改進(jìn)

MQTT 5.0 中將 Clean Session 拆成:

  • Clean Start

    指定連接時(shí)是創(chuàng)建一個(gè)全新的會話還是嘗試復(fù)用一個(gè)已存在的會話

  • Session Expiry Interval

    指定網(wǎng)絡(luò)連接斷開后會話的過期時(shí)間

Clean Start 為 true 時(shí)表示必須丟棄任何已存在的會話,并創(chuàng)建一個(gè)全新的會話;為 false 時(shí)表示必須使用與 Client ID 關(guān)聯(lián)的會話來恢復(fù)與客戶端的通信(除非會話不存在)。

Session Expiry Interval 解決了 MQTT 3.1.1 中持久會話永久存在造成的服務(wù)器資源浪費(fèi)問題。設(shè)置為 0 或未設(shè)置,表示斷開連接時(shí)會話即到期;設(shè)置為大于 0 的數(shù)值,則表示會話在網(wǎng)絡(luò)連接關(guān)閉后會保持多少秒;設(shè)置為 0xFFFFFFFF 表示會話永遠(yuǎn)不會過期。

7 FAQ

當(dāng)會話結(jié)束后,保留消息還存在么?

[MQTT 保留消息]不是會話狀態(tài)的一部分,它們不會在會話結(jié)束時(shí)被刪除。

客戶端如何知道當(dāng)前會話是被恢復(fù)的會話?

MQTT 協(xié)議從 v3.1.1 開始,就為 CONNACK 報(bào)文設(shè)計(jì)了 Session Present 字段。當(dāng)服務(wù)器返回的該字段值為 1 時(shí),表示當(dāng)前連接將會復(fù)用服務(wù)器保存的會話??蛻舳丝赏ㄟ^該字段值決定在連接成功后是否需要重新訂閱。

使用持久會話的建議

  • 不能使用動(dòng)態(tài) Client ID,需要保證客戶端每次連接的 Client ID 都是固定的。
  • 根據(jù)服務(wù)器性能、網(wǎng)絡(luò)狀況、客戶端類型等合理評估會話過期時(shí)間。設(shè)置過長會占用更多的服務(wù)端資源,設(shè)置過短會導(dǎo)致未重連成功會話就失效。
  • 當(dāng)客戶端確定不再需要會話時(shí),可使用 Clean Session 為 true 進(jìn)行重連,重連成功后再斷開連接。如果是 MQTT 5.0 則可在斷開連接時(shí)直接設(shè)置 Session Expiry Interval 為 0,表示連接斷開后會話即失效。

8 總結(jié)

至此完成對 MQTT 持久會話的介紹,并通過桌面客戶端演示了 Clean Session 的使用。讀者可參考本文借助 MQTT 持久會話實(shí)現(xiàn)離線消息的接收及降低訂閱開銷。

作者簡介:魔都國企技術(shù)專家,多家大廠后臺研發(fā)和架構(gòu)經(jīng)驗(yàn),負(fù)責(zé)復(fù)雜度極高業(yè)務(wù)系統(tǒng)的模塊化、服務(wù)化、平臺化研發(fā)工作。具有豐富帶團(tuán)隊(duì)經(jīng)驗(yàn),深厚人才識別和培養(yǎng)的積累。

參考:

編程嚴(yán)選網(wǎng)

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!文章來源地址http://www.zghlxwxcb.cn/news/detail-774302.html

到了這里,關(guān)于MQTT 持久會話 vs. Clean Session內(nèi)幕一網(wǎng)打盡的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 動(dòng)態(tài)規(guī)劃系列 | 最長上升子序列模型(下)| 攔截導(dǎo)彈一網(wǎng)打盡!

    動(dòng)態(tài)規(guī)劃系列 | 最長上升子序列模型(下)| 攔截導(dǎo)彈一網(wǎng)打盡!

    題目描述 某國為了防御敵國的導(dǎo)彈襲擊,發(fā)展出一種導(dǎo)彈攔截系統(tǒng)。 但是這種導(dǎo)彈攔截系統(tǒng)有一個(gè)缺陷:雖然它的第一發(fā)炮彈能夠到達(dá)任意的高度,但是以后每一發(fā)炮彈都不能高于前一發(fā)的高度。 某天,雷達(dá)捕捉到敵國的導(dǎo)彈來襲。 由于該系統(tǒng)還在試用階段,所以只有一套

    2024年02月03日
    瀏覽(22)
  • 一網(wǎng)打盡java注解-克隆-面向?qū)ο笤O(shè)計(jì)原則-設(shè)計(jì)模式

    一網(wǎng)打盡java注解-克隆-面向?qū)ο笤O(shè)計(jì)原則-設(shè)計(jì)模式

    注解 :也叫標(biāo)注,用于包、類、變量、方法、參數(shù)上??梢酝ㄟ^反射獲取標(biāo)注??梢栽诰幾g期間使用,也可以被編譯到字節(jié)碼文件中,運(yùn)行時(shí)生效。 內(nèi)置注解 :Java語言已經(jīng)定義好的注解。 @Overread :用于方法重寫。 @Deprecated :標(biāo)記過時(shí)方法。 @SuppressWarnings :指示編譯器去

    2024年02月11日
    瀏覽(19)
  • C++回調(diào)函數(shù)精解:基礎(chǔ)使用和高級技巧一網(wǎng)打盡

    C++回調(diào)函數(shù)精解:基礎(chǔ)使用和高級技巧一網(wǎng)打盡

    ? 概述: C++回調(diào)函數(shù)提供了靈活的編程方式?;A(chǔ)使用演示了如何定義和調(diào)用簡單的回調(diào),而高級使用則展示了返回值非 `void` 的回調(diào)和Lambda表達(dá)式的靈活性。這種機(jī)制使程序更模塊化、可維護(hù)。 在C++中,回調(diào)函數(shù)可以用于實(shí)現(xiàn)基礎(chǔ)和高級的功能。以下是一個(gè)包含基礎(chǔ)和高級

    2024年03月18日
    瀏覽(29)
  • Java HttpClient 實(shí)戰(zhàn) GET 與 POST 請求一網(wǎng)打盡

    在Java中, HttpClient 是進(jìn)行HTTP通信的一個(gè)強(qiáng)大工具。它提供了簡單而靈活的API,可以輕松地發(fā)送HTTP請求并處理響應(yīng)。在本篇博文中,我們將深入探討如何使用 HttpClient 執(zhí)行GET、POST等不同類型的HTTP請求。 首先,確保在項(xiàng)目的 pom.xml 文件中引入 HttpClient 的依賴: 讓我們從一個(gè)簡

    2024年01月17日
    瀏覽(25)
  • Git新手?這篇文章帶你飛!基礎(chǔ)操作一網(wǎng)打盡!

    Git新手?這篇文章帶你飛!基礎(chǔ)操作一網(wǎng)打盡!

    智能化校園:深入探討云端管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(一) 智能化校園:深入探討云端管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)(二) Git(讀音為/g?t/) 是一個(gè)開源的分布式版本控制系統(tǒng),可以有效、高速地處理從很小到非常大的項(xiàng)目版本管理。 git是世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒有之一)

    2024年01月17日
    瀏覽(18)
  • Java面試、進(jìn)階、實(shí)踐一網(wǎng)打盡(由電子工業(yè)出版社出版)

    Java面試、進(jìn)階、實(shí)踐一網(wǎng)打盡(由電子工業(yè)出版社出版)

    準(zhǔn)備好應(yīng)對Java開發(fā)的新挑戰(zhàn)嗎?我們?yōu)槟x了五本核心書籍,一站式滿足您在Java面試準(zhǔn)備、技能進(jìn)階和實(shí)戰(zhàn)應(yīng)用的需求。 這套書籍包括《Offer來了:Java面試核心知識點(diǎn)精講(第2版)》、《Java面試八股文:高頻面試題與求職攻略一本通》、《Spring Boot編程思想(核心卷)》

    2024年02月04日
    瀏覽(90)
  • Python虛擬環(huán)境(pipenv、venv、conda一網(wǎng)打盡)[通俗易懂]

    Python虛擬環(huán)境(pipenv、venv、conda一網(wǎng)打盡)[通俗易懂]

    1. 什么是Python環(huán)境 要搞清楚什么是虛擬環(huán)境,首先要清楚Python的環(huán)境指的是什么。當(dāng)我們在執(zhí)行python test.py時(shí),思考如下問題: python哪里來?這個(gè)主要?dú)w功于配置的系統(tǒng)環(huán)境變量 PATH ,當(dāng)我們在命令行中運(yùn)行程序時(shí),系統(tǒng)會根據(jù) PATH 配置的路徑列表依次查尋是否有可執(zhí)行文件

    2024年02月08日
    瀏覽(25)
  • Rust 全面指南:從基礎(chǔ)到高級,一網(wǎng)打盡 Rust 的編程知識

    因?yàn)樵趯W(xué)習(xí)Rust過程中,因?yàn)榇a量不是太多,所以有一些學(xué)完就忘了,特此記錄一些Rust知識點(diǎn) Rust是什么? Rust是一種現(xiàn)代的、強(qiáng)類型的、系統(tǒng)級編程語言。它被設(shè)計(jì)用于編寫高性能、并發(fā)、安全的系統(tǒng),并且可以避免常見的內(nèi)存安全問題,如空指針和數(shù)據(jù)競爭。Rust的特點(diǎn)包

    2024年02月08日
    瀏覽(26)
  • Nginx一網(wǎng)打盡:動(dòng)靜分離、壓縮、緩存、黑白名單、跨域、高可用、性能優(yōu)化...

    Nginx一網(wǎng)打盡:動(dòng)靜分離、壓縮、緩存、黑白名單、跨域、高可用、性能優(yōu)化...

    干貨!文章有點(diǎn)長,建議先收藏 早期的業(yè)務(wù)都是基于單體節(jié)點(diǎn)部署,由于前期訪問流量不大,因此單體結(jié)構(gòu)也可滿足需求,但隨著業(yè)務(wù)增長,流量也越來越大,那么最終單臺服務(wù)器受到的訪問壓力也會逐步增高。時(shí)間一長,單臺服務(wù)器性能無法跟上業(yè)務(wù)增長,就會造成線上頻

    2024年02月07日
    瀏覽(17)
  • MYSQL數(shù)字函數(shù)實(shí)操寶典:場景化SQL語句一網(wǎng)打盡

    MYSQL數(shù)字函數(shù)實(shí)操寶典:場景化SQL語句一網(wǎng)打盡

    ??? 個(gè)人主頁: danci_ ?? 系列專欄: 《設(shè)計(jì)模式》《MYSQL應(yīng)用》 ???? 制定明確可量化的目標(biāo),堅(jiān)持默默的做事。 MYSQL數(shù)字函數(shù):不可不知的數(shù)據(jù)處理利器 ? ? mysql -u root -p; ?命令說明:?? ?1. mysql: ????? 這是 MySQL 客戶端工具的命令名。它允許用戶連接到 MySQL 數(shù)據(jù)庫

    2024年04月15日
    瀏覽(69)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包