Mqtt協議——cleansession、retain、will、Shared Subscription

前言

之前看了一些關於Mqtt協議的文章,看完了沒有去做筆記,過了這麼久忘了很多。最近剛好在做相關的東西,需要用到,就順便記下來了。

正文


cleansession

清除會話

在客戶端連接服務端時設置。

值爲:true/false

作用:服務器必須在客戶端斷開之後繼續存儲/保持客戶端的訂閱狀態,包括以下狀態

  • 存儲訂閱的消息Qos1和Qos2消息,當客戶端重新訂閱時發送
  • 服務端正在發送消息給客戶端期間連接丟失導致發送失敗的消息

retain

持久消息。

想一下以下場景,你有個溫溼度傳感器,每隔幾個鍾向主題發送一次消息,此時你有個新的客戶端訂閱了這個主題,那它難道要等上幾個鍾才能獲得消息嗎?可不可以一訂閱就獲取上一次發送的消息呢? 答案是可以的

值爲: true/false

作用:表示發送的消息需要一直持久保存(不受服務器重啓影響),不但要發送給當前的訂閱者,並且以後新來的訂閱了此Topic name的訂閱者會馬上得到推送。

注意:新來的訂閱了此topic name的訂閱者指的是新的clientID用戶,也就是說假如你是叫12345的用戶在同一次的連接中多次重複訂閱的話是和訂閱一次一樣的;(除非你①斷線了重新連接了,②取消訂閱後又重新訂閱,這樣都可以再次獲得retain消息。)

如果你想要取消retian消息的話向這個主題發個空的消息就好了~


will

遺願消息

想一下以下場景,你的設備向服務端發送了在線的消息後突然爆炸了,它還沒來得及和服務端說它爆炸了就死了,這樣會勿讓我們以爲它還在線,但其實它已經掛了。 有沒有方法讓客戶端非正常斷線後通知服務端呢? 有的,就是使用遺願消息

在建立與服務端的連接時約定好遺願消息,服務端會存儲這個消息,當客戶端非正常斷線時則會向約定好的主題發送遺願消息,同樣,它也可以設置爲retian


share subscription

共享訂閱(需要支持mqtt5.0的broker)

假設 4 個訂閱者訂閱了同一個主題,此時有發佈者發送任務到該主題,以往的話是4個訂閱者都會收到這條任務,然後去處理 ;但現在假如只想每條消息有一個訂閱者處理即可,那麼使用共享訂閱就可以了

共享訂閱針對場景應是數據的生產者遠超出數據消費者數量,而且同一條數據(消息)只需要被任意其中一個消費者處理一次。主要是實現消費者數量處理消息的均衡負載


在這裏插入圖片描述
創建共享訂閱的兩種方式:

主題前綴 實例
$queue/:topic sub $queue/up/data
$share/:group/:topic sub $share/group/up/data

共享訂閱由三部分組成:

  • 靜態共享標識符 ($queue 與 $share)
  • 組標識符(可選)
  • 實際接收消息的主題

$ queue和$ share的差異:

$queue 之後的主題中所有消息將輪流發送到客戶端,

$share 之後,您可以添加不同的組,例如:

  • $share/group_1/topic
  • $share/group_2/topic
  • $share/group_3/topic

當broker 向 topic 發送消息時,每個組都會收到該消息,並將該消息隨機發送給本組中的一個設備

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