前言
之前看了一些關于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 發送消息時,每個組都會收到該消息,并将該消息随機發送給本組中的一個裝置