MQTT快速入門

0x00 爲什麼使用MQTT

消息隊列遙測傳輸MQTT(Message Queuing Telemetry Transport)是從消息隊列MQ(MessageQueue,傳統的Publish/Subscribe訂閱模型)演變而來,但具有面向物聯網應用的特點設計。

從設計目的上講,MQTT面向物聯網,充分理解這種由於成本帶來的糟糕帶寬/低下性能。斷線重連是基操,保證消息的投遞/重試是標準,客戶端提前立遺囑以便於掉線處理後事是專屬設計。

從使用特點上講,MQTT與微服務密不可分。MQTT服務器端(代理/Broker)運行之後成爲一個單獨的服務接入點,需要爲之分配處理程序資源,MQTT接入的流量可解碼打包直接丟給Kafka,在解耦了各應用各語言的同時還能保持良好的擴展性。

如果你有以上兩個痛點需求,那麼你需要的正是MQTT,而不是Netty或其他純TCP框架。

0x01 MQTT概念與構成元素

https://blog.csdn.net/qq_28877125/article/details/78325003

從接入上看,MQTT由服務端、發佈端和訂閱端組成,符合傳統的MQ結構。

0x02 MQTT使用

MQTT本身是一種通信協議,如果想要實際使用,需要選擇實現的載體(即服務端/代理端/Broker),市面上有許多實現的實例,各有優缺點。

https://www.jianshu.com/p/cf91f4bea071

博主自測了兩款實現:Mosquitto和EMQx。測試使用如下代碼運行,分別扮演客戶端和發佈端。

# sub.py 訂閱端
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code: " + str(rc))

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

def on_disconnect(client, userdata, rc):
    print("Disconnect with result code: " + str(rc))

# client = mqtt.Client(client_id, transport='tcp')
client = mqtt.Client()
client.username_pw_set(username='admin', password='123456')
client.on_connect = on_connect
client.on_message = on_message
client.on_disconnect = on_disconnect
client.connect(host='127.0.0.1', port=1883, keepalive=600)
client.subscribe('fifa', qos=1)
client.loop_forever()

 

# pub.py 發佈端
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code: " + str(rc))

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

client = mqtt.Client()
client.username_pw_set(username='admin', password='123456')
client.on_connect = on_connect
client.on_message = on_message
client.connect(host='127.0.0.1', port=1883, keepalive=600)
client.publish('fifa', payload='amazing', qos=1)

Mosquitto是由C/C++實現的一種極簡MQTT實現,主要面向嵌入式。

 以上是mosquitto-1.6.9-install-windows-x64全貌,從文件結構上也能體會到mosquitto的簡潔性。

# 啓動mosquitto, -v選項能夠看到Broker詳細輸出
mosquitto -c mosquitto.conf -v

實際測試發現mosquitto目前仍然處於開發階段,qos收發策略測試都不能完全進行。原因在於配置文件817行cleansession false註釋一旦取消再次啓動就報錯。如果項目很小,也比較簡單可以考慮mosquitto,流量大需要做集羣負載均衡等就不推薦了,本身是不支持的。

# Set the clean session variable for this bridge.
# When set to true, when the bridge disconnects for any reason, all
# messages and subscriptions will be cleaned up on the remote
# broker. Note that with cleansession set to true, there may be a
# significant amount of retained messages sent when the bridge
# reconnects after losing its connection.
# When set to false, the subscriptions and messages are kept on the
# remote broker, and delivered when the bridge reconnects.
#cleansession false

EMQx Broker是由EMQ公司推出的開源MQTT Broker,支持分佈式集羣,限流限速,共享訂閱等諸多便捷功能。

https://www.emqx.io/cn/

在企業級應用中經常需要均衡承載各種流量/轉發等,EMQx都有推出對應的連接插件,可以說勝任各種場景均沒問題。

https://docs.emqx.io/broker/latest/cn/

D:\Temp\emqx-windows-v4.0.6\emqx\bin\emqx.cmd
usage: emqx (install|uninstall|start|stop|restart|console|ping|list|attach)

# 啓動EMQx,由於使用ErLang開發,此處可能需要提前安裝ErLang
emqx start

# 訪問Dashboard網頁控制面板
http://127.0.0.1:18083/
admin
public

再次用之前的python發佈端/訂閱端測試,基本表現與mosquitto一致,但無疑支持的內容更多。

0x03 結語

至此已建立MQTT基本使用模型,往後的插件協作與經驗分享有機會再補充。

Mosquitto和EMQx的配置可參照其他文章。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章