天天看點

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個訂閱者都會收到這條任務,然後去處理 ;但現在假如隻想每條消息有一個訂閱者處理即可,那麼使用共享訂閱就可以了

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

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

建立共享訂閱的兩種方式:

主題字首 執行個體
$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 發送消息時,每個組都會收到該消息,并将該消息随機發送給本組中的一個裝置

繼續閱讀