MQTT Broker mosquitto


MQTT

全稱

MQ Telemetry Transport 消息隊列遙測傳輸協議
IBM 1994開發
MQTT v3.1.1 第4版 OASIS標准
1 to 0/1/N

簡介

MQTT是一個TCP服務端,稱為broker。
通過這個broker服務,我們可以作為發布者,發送一條主題消息給broker,然后其他訂閱者通過消息訂閱機制獲得broker的主題消息推送。我們也可以作為訂閱者,訂閱其他發布者的主題消息。

對比MQ

消息隊列存儲消息,直到它們被消耗
消息隊列中只有一個消費者處理消息,MQTT中訂閱主題的每個訂閱者都會收到消息
消息隊列要提前並明確創建,MQTT中可以隨時實時創建

議題

  • 自動重連 Automatic Reconnect
  • 離線緩存 Offline Buffering
  • 消息持久化 Message Persistence
  • 高可用 High Availability
  • 安全 SSL/TLS
  • websocket支持

連接

建立

broker開啟一個host的TCP 1883端口
客戶端連接Broker
如果是重連,需要帶上上次ClientID
如果不是重連,可以指定CleanSession是否清空之前會話
可以指定兩端之間心跳維持時間
服務端根據參數,重用或開啟會話Session,綁定ClientID
一個會話,可以服務多個TCP連接,取決於是否CleanSession

會話

PersistentSession與CleanSession
session相關信息將會同時保存在broker和client中,session里包含以下內容:
客戶端的訂閱信息
從broker接收來的還沒有ack的消息
發送給client的還沒有ack的消息

斷開

客戶端主動斷開:客戶端發送 DISCONNECT 關閉鏈接,遺囑失效並刪除
客戶端異常斷開:遺囑消息發布

消息

消息類型

心跳消息
連接、斷開連接消息 10 e0
訂閱、取消訂閱消息 80
發布消息 30

遺囑消息

為了能知道哪個客戶端異常斷開,broker定時查詢客戶端狀態。
當檢查到客戶端異常斷開時,就發布客戶端連接時指定的遺囑消息到指定主題。
正常斷開,是不會有遺囑消息發布的。

保留消息

發布者發布主題消息時,可以指定消息是否緩存到broker,作為對應主題的最后一次消息記錄
訂閱者連接后,可一次性獲取想要的主題的全部保留消息

主題

分層過濾格式

樹狀結構,用'/'分隔,如:home/light/brightness
通配符:

  • 單層通配符 如,a/b/+” 匹配 “a/b/c1” 和 “a/b/c2”,但是不匹配 “a/b/c/d”

多層通配符 如 “a/b/c/#" 可以匹配 “a/b/c”、“a/b/c/d” 和 “a/b/c/d/e”

特殊的主題$SYS

查看服務器的狀態信息

消息分發可靠性QoS

  • 至多一次 允許丟失,無需回復訂閱者回復,發布者自動刪除。適用傳感器數據
  • 至少一次 確保到達,需要訂閱者回復,發布者和broker都緩存消息,待訂閱者回復后,再依次刪除消息緩存。可能重復發送
  • 只有一次 確保到達,不重復不丟失,用的很少
    圖示

消息發布與訂閱

基於主題的消息過濾,可以使用通配符來訂閱多個主題的消息
發布消息時,不可以使用通配符,必須指定完整的topic名
如果想發送給多個topic,需要發布多次
發布者在每次發布消息時都需要設置QoS

消息存儲

可以使用基於內存的,但是單點故障情況下,消息會丟失。
可以結合外部redis,進行消息外部存儲。

redis消息持久化配置

storage_class io.moquette.persistence.redis.RedisStorageService 

# redis storage
redis.host localhost
redis.port 6379
redis.password
redis.database 0
redis.prefix monitor:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM