1. 程式人生 > >MQTT 5.0 新特性(四)Clean Start 與 Session Expiry Interval

MQTT 5.0 新特性(四)Clean Start 與 Session Expiry Interval

前言

MQTT v5.0 中的 Clean Start 與 Session Expiry Interval,對於有 MQTT v3.1.1 版本協議使用經驗的朋友,一定不會感覺陌生,因為這兩個欄位與之前版本中的 Clean Session 非常相似。但它們在實際使用中遠比 Clean Session 靈活,下文將詳細介紹這幾個欄位的作用與區別。

MQTT v3.1.1 版本的 Clean Session

如果 Clean Session 設定為 0,服務端必須使用與 Client ID 關聯的會話來恢復與客戶端的通訊。如果不存在這樣的會話,伺服器必須建立一個新會話。客戶端和伺服器在斷開連線後必須儲存會話的狀態。

如果 Clean Session 設定為 1,客戶端和伺服器必須丟棄任何先前的會話並建立一個新的會話。該會話的生命週期將和網路連線保持一致,其會話狀態一定不能被之後的任何會話重用。

可以看出,MQTT 期望通過這種持久會話的機制避免客戶端掉線重連後訊息的丟失,並且免去客戶端連線後重復的訂閱流程。這一功能在頻寬小,網路不穩定的物聯網場景中非常實用。但 Clean Session 同時限定了客戶端和伺服器在連線和斷開連線兩種狀態下的行為,這並不是一個很好的實現。此外,在某些場景下會話並不需要伺服器永久保留自己的狀態時,這個機制將會導致伺服器資源的浪費。

MQTT v5.0 版本的 Clean Start 與 Session Expiry Interval

如果 CONNECT 報文中的 Clean Start 為 1,客戶端和服務端必須丟棄任何已存在的會話,並開始一個新的會話。

如果 CONNECT 報文中的 Clean Start 為 0 ,並且存在一個關聯此客戶端識別符號的會話,服務端必須基於此會話的狀態恢復與客戶端的通訊。如果不存在任何關聯此客戶端識別符號的會話,服務端必須建立一個新的會話。

Session Expiry Interval 以秒為單位,如果 Session Expiry Interval 設定為 0 或者未指定,會話將在網路連線關閉時結束。

如果 Session Expiry Interval 為 0xFFFFFFFF ,則會話永不過期。

如果網路連線關閉時(DISCONNECT 報文中的 Session Expiry Interval 可以覆蓋 CONNECT 報文中的設定) Session Expiry Interval 大於0,則客戶端與服務端必須儲存會話狀態 。

現在,Clean Start 替代了原先的 Clean Session,但不再用於指示是否儲存會話狀態,僅用於指示服務端在連線時應該嘗試恢復之前的會話還是直接建立全新的會話。會話狀態在服務端的儲存時長則完全交給 Session Expiry Interval 決定。

前面還提到,MQTT v5.0 支援客戶端在斷開連線時重新指定 Seesion Expiry Interval。這樣我們可以非常容易地滿足類似客戶端網路連線異常斷開時會話狀態被伺服器保留,客戶端正常下線時會話則隨著連線關閉而結束的場景,只需要客戶端在斷開連線時將 Session Expiry Interval 設定為 0 即可。即便是一個已經永不過期的會話,客戶端也可以在下一次連線中通過設定 Clean Start 為 1 來 "反悔"。

Clean Start 與 Session Expiry Interval 不僅解決了 Clean Session 的遺留問題,同時也擴充套件了客戶端的使用場景,使 MQTT 協議在受限的網路環境下更加實用。


更多資訊請訪問我們的官網 emqx.io,或關注我們的開源專案 github.com/emqx/emqx ,詳細文件請訪問

相關推薦

MQTT 5.0 特性Clean Start Session Expiry Interval

前言 MQTT v5.0 中的 Clean Start 與 Session Expiry Interval,對於有 MQTT v3

MQTT 5.0 特性— 有效載荷標識內容型別

有效載荷標識(Payload Format Indicator)與內容型別(Content Type)是 MQTT 5.0 新引入

Android O 8.0特性 官方Demo

主要採用的google翻譯,不當之處,還望指正.Code Samples 程式碼示例Use the code samples below to learn about Android 8.0 (API level 26) capabilities and APIs. To d

Java8的特性

並行流與序列流 什麼是並行流 我們先了解一下什麼是Fork/Join框架 Fork/Join框架和傳統的執行緒池的區別 應用Fork/Join計算100000000的和: public class ForkJoinCalculate extends

Spring Boot 2.0 特性:配置繫結 2.0 全解析

在Spring Boot 2.0中推出了Relaxed Binding 2.0,對原有的屬性繫結功能做了非常多的改進以幫助我們更容易的在Spring應用中載入和讀取配置資訊。下面本文就來說說Spring Boot 2.0中對配置的改進。 配置檔案繫結 簡單型別 在S

C# 7.0 特性2: 本地方法

本文參考Roslyn專案中的Issue:#259. 簡而言之,【本地方法】就是在方法體內部定義一個方法。 其實咋眼一看,這個新特新並沒有什麼新意,因為目前大量C#的專案中,都可以使用delegate或基於delegate變形的各種方案(lambda, Fun,

C# 7.0 特性1: 基於Tuple的“多”返回值方法

本文基於Roslyn專案中的Issue:#347 展開討論. 回顧 首先,提出一個問題,C#中,如何使一個方法可返回”多個”返回值? 我們先來回顧一下C#6.0 及更早版本的做法。 在C#中,通常我們有以下4種方式使一個方法返回多條資料。 使用 KeyVal

Python 3.0 特性1

萬眾期待的Python3.0(final)在2008年12月3日釋出了,本文將介紹一下Python3所具有的與Python2.5不同的新特性。 Python3的下載地址是: 1.print的變化:、 在python3.0中,print成為了一個函式,將傳入的引數

java8特性:Stream流的使用

Java5的時候就引入了自動裝箱拆箱的功能, 在對包裝型別進行數學計算的時候,包裝型別就會被自動拆箱成基本型別, 而將一個基本型別的值賦值給一個包裝型別的變數或者放入集合中時基本型別又會被自動裝箱成包裝型別,這個過程是需要消耗計算效能的。Java8的包裝型別的流的計算過程中同樣包含了對基本型別的自動裝箱和拆箱

Java8特性------介面中可以定義方法體

 Java8比起以前的版本存在很大的變化,我們知道在之前的版本中介面只能是定義抽象的方法,是不能定義實現的,但是在java8環境下,這個不可能已經變得可能。下面我們通過例子一步一步的來講解下java8

C# 4.0特性白皮書[轉]

Contents 目錄 Introduction 簡介 C# 4.0 Dynamic Lookup 動態查詢 The dynamic type dynamic型別 Dynamic operations 動態操作 Runtime lookup 執行時查詢 Exam

Spring學習總結23——Spring Framework 5.0 特性

Spring Framework 5.0 是自 2013年12月版本 4 釋出之後 Spring Framework 的第一個主發行版。Spring Framework 專案的領導人 Juergen

Servlet2.5和 3.0區別Servlet 3.0 特性詳解

Servlet 3.0 新特性概述 Servlet 3.0 作為 Java EE 6 規範體系中一員,隨著 Java EE 6 規範一起釋出。該版本在前一版本(Servlet 2.5)的基礎上提供了若干新特性用於簡化 Web 應用的開發和部署。其中有幾項特性的引

MySQL 8.0.2復制特性翻譯

ogl 防止 將不 地址 arc -- 等待 download 日誌 譯者:知數堂星耀隊 MySQL 8.0.2復制新特性 MySQL 8 正在變得原來越好,而且這也在我們MySQL復制研發團隊引起了一陣熱潮。我們一直致力於全面提升MySQL復制,通過引入新的和一些有趣

迄今最安全的MySQL?細數5.7那些驚豔雞肋的特性

STRICT_TRANS_TABLES 意思是說要儲存的欄位的長度大於欄位定義的大小,直接報錯而非像5.6版本以及之前,截斷資料進行儲存,同時丟擲一個warning。注意同一個會話調整 sql_mode必須退出之後在進入sql_mode才會生效。詳細瞭解SQL_MODE請移步《sql_mode官方文件》(h

jdk 1.5 特性 ZZ

JDK 1.5Java 5.0釋出了,許多人都將開始使用這個JDK版本的一些新增特性。從增強的for迴圈到諸如泛型(generic)之類更復雜的特性,都將很快出現在您所編寫的程式碼中。我們剛剛完成了一個基於Java 5.0的大型任務,而本文就是要介紹我們使用這些新特性的體驗。本文不是一篇入門性的文章,而是對這

.net 4.0 中對多執行緒特性

      在.net 40中對多執行緒的處理增加了很多新的類以方便多執行緒環境下的程式設計實現,首先需要了解的是兩個非常有用的類Lazy<T>和ThreadLazy<T>,通過這兩個類我們可以很方便實現一個單例模式而不用考慮太多的執行緒安全的問題。

Kubernetes1.5特性:Kubelet API增加認證和授權能力

背景介紹 在Kubernetes1.5中,對於kubelet新增加了幾個同認證/授權相關的幾個啟動引數,分別是: 認證相關引數

kubernetes1.5特性:支援Photon卷外掛

在Kubernetes中卷的作用在於提供給POD持久化儲存,這些持久化儲存可以掛載到POD中的容器上,進而

.net core 2.0學習筆記:遷移.net framework 工程到.net core

編譯 its evel hashtable ref 學習筆記 inline null 創建 在遷移.net core的過程中,第一步就是要把.net framework 工程的目標框架改為.net core2.0,但是官網卻沒有提供轉換工具,需要我們自己動手完成了