什麼是MQTT
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發佈/訂閱(publish/subscribe)模式的輕量級協議,該協議構建於TCP/IP協議之上。
MQTT特徵
- 基於 TCP 協議的應用層協議;
- 採用 C/S 架構;
- 使用訂閱/發佈模式,將消息的發送方和接受方解耦;
- 提供 3 種消息的 QoS(Quality of Service): 至多一次,最少一次,只有一次;
- 收發消息都是異步的,發送方不需要等待接收方應答。
與傳統MQ的區別
雖然 MQTT 協議名稱有 Message Queue 兩個詞,但是它並不是一個像 RabbitMQ 那樣的一個消息隊列,MQTT 跟傳統的消息隊列相比,有以下一些區別:
- 在傳統消息隊列中,在發送消息之前,必須先創建相應的隊列;在 MQTT 中,不需要預先創建要發佈的主題(可訂閱的 Topic);
- 在傳統消息隊列中,未被消費的消息總是會被保存在某個隊列中,直到有一個消費者將其消費;在 MQTT 中,如果發佈一個沒有被任何客戶端訂閱的消息,這個消息將被直接扔掉;
- 在傳統消息隊列中,一個消息只能被一個客戶端獲取,在 MQTT 中,一個消息可以被多個訂閱者獲取,MQTT 協議也不支持指定消息被單一的客戶端獲取。
MQTT通訊模型
MQTT 的通信是通過發佈/訂閱的方式來實現的,消息的發佈方和訂閱方通過這種方式來進行解耦,它們沒有直接地連接,它們需要一箇中間方(Broker)。
- 發佈方(Publisher)將消息發送到 Broker;
- Broker 接收到消息以後,檢查下都有哪些訂閱方訂閱了此類消息,然後將消息發送到這些訂閱方(subscriber);
- 訂閱方(subscriber)從 Broker 獲取該消息;
MQTT Client
任何終端,只要運行了 MQTT 的庫或者代碼,我們都可以將其稱爲 MQTT 的 Client,一個 Client 可以同時是 Publisher 和 Subscriber。
MQTT Broker
Broker 負責接收 Publisher 的消息,併發送給相應的 Subscriber,它是整個 MQTT 訂閱/發佈的核心,具有以下功能:
- 可以橫向擴展,比如集羣,來滿足大量的 Client 接入;
- 可以擴展接入業務系統;
- 易於監控,滿足高可用性。
MQTT協議數據包的固定包頭
名稱 | 值 | 方向 | 描述 |
---|---|---|---|
Reserved | 0 | 不可用 | 保留位 |
CONNECT | 1 | Client 到 Broker | Client 請求連接到 Broker |
CONNACK | 2 | Broker 到 Client | 連接確認 |
PUBLISH | 3 | 雙向 | 發佈消息 |
PUBACK | 4 | 雙向 | 發佈確認 |
PUBREC | 5 | 雙向 | 發佈收到 |
PUBREL | 6 | 雙向 | 發佈釋放 |
PUBCOMP | 7 | 雙向 | 發佈完成 |
SUBSCRIBE | 8 | Client 到 Broker | Client 請求訂閱 |
SUBACK | 9 | Broker 到 Client | 訂閱確認 |
UNSUBSCRIBE | 10 | Client 到 Broker | Client 請求取消訂閱 |
UNSUBACK | 11 | Broker 到 Client | 取消訂閱確認 |
PINGREQ | 12 | Client 到 Broker | PING 請求 |
PINGRESP | 13 | Broker 到 Client | PING 應答 |
DISCONNECT | 14 | Client 到 Broker | Client 主動中斷連接 |
Reserved | 15 | 不可用 | 保留位 |