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: