概述
上一篇介紹了IoT MQ的一些基本知識以及與Kafka這類“系統級別”的MQ的區別,同時簡單介紹了使用最廣的兩種物聯網通信協議coap與mqtt並最終決定使用mqtt作爲基礎協議,本篇主要介紹IoT MQ在進行設計時考慮到的一些問題:
-
IoT MQ需求及系統複雜度分析
-
開源or自研
需求及系統複雜度分析
因爲初始階段對於IoT MQ並不是很瞭解,也從未涉及過物聯網領域,所以初步從兩個方面考慮:功能方面與系統方面。
功能層面
-
該IoT MQ應該能對接入的客戶端進行管理,包括統計,監控流量,強制下線,數據傳輸等
-
能對集羣,broker主機進行監控等
-
該IoT MQ應該能將數據上雲進行分析,主要是通過橋接RocketMQ等上行到其它存儲平臺進行數據分析
系統層面
-
服務高可用:不能有單點故障等問題,所以該IoT MQ必須要能集羣部署,數據必須有一定可靠性,不能出現數據大量丟失的情況
-
高連接高請求:也就是高性能,不過要求單機(4c16g)要支持十萬級以上的連接,並且消息TPS要高,同時響應時間低
-
高可擴展性:架構總是演進的,需求也一直在變,纔開始的IoT MQ的設計只滿足了最低的需求,所以必須要是高可擴展性的
-
安全:物聯網一定是公網的,所以需要考慮傳輸加密以及權限驗證等安全,要實現TLS/SSL以及權限驗證等
-
規模:初始規模一般預估爲真實需求的2到5倍,我們初始評估長連接設備數20W,消息大小爲200byte的消息的TPS至少達到10000,響應時間在100ms內
-
成本:集羣部署爲了節省主機成本所以單機性能有一定要求,人員方面技能儲備以java爲主
開源or自研
在對功能和系統進行分析後,我們有了兩種基本的方案:1.基於開源項目二次開發,2.完全自研。我們先看一下選擇開源項目的優劣勢:
優勢:
-
開源項目一般已經有人維護,如果社區活躍的也有很多解決方案,技術成本較低,開發者的壓力也較低
-
不用重複造輪子,重新走老路,時間成本等也降低了
劣勢:
-
開源項目一般是針對“通用”的場景,大改起來比較麻煩,特別是設計不好的開源項目
-
開源項目的可靠性,可用性等需要考量,安全,靈活性等也降低了
前期對於時間成本,技術學習成本都比較看重,所以找個合適的開源項目進行二次開發也是很好的選擇,這裏有所有的mqtt server
下面是一些mqtt服務的對比:
Server | QoS 0 | QoS 1 | QoS 2 | auth | bridge | $SYS | SSL | dynamic topics | cluster | websockets | plugin system |
---|---|---|---|---|---|---|---|---|---|---|---|
2lemetry | ✔ | ✔ | ✔ | ✔ | ✔ | § | ✔ | ✔ | ✔ | ✔ | ✘ |
Jmqtt | ✔ | ✔ | ✔ | ✔ | ✔ | § | § | ✔ | § | ✔ | ✔ |
Apache ActiveMQ | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✔ |
Apache ActiveMQ Artemis | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✔ |
Bevywise IoT Platform | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | rm |
emitter | ✔ | § | ✘ | ✔ | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ |
emqttd | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
flespi | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ |
GnatMQ | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ | ✘ | ✔ | ✘ | ✘ | ✘ |
HBMQTT | ✔ | ✔ | ✔ | ✔ | ✘ | ✔ | ✔ | ✔ | ✘ | ✔ | ✔ |
HiveMQ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
IBM MessageSight | ✔ | ✔ | ✔ | ✔ | ✘ | ✔ | ✔ | ✔ | § | ✔ | ✘ |
JoramMQ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
Mongoose | ✔ | ✔ | ? | ? | ? | ? | ? | ? | ? | ? | ? |
moquette | ✔ | ✔ | ✔ | ✔ | ? | ? | ✔ | ? | rm | ✔ | ✘ |
mosca | ✔ | ✔ | ✘ | ✔ | ? | ? | ? | ? | ✘ | ✔ | ✘ |
mosquitto | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | § | ✔ | ✔ |
MQTT.js | ✔ | ✔ | ✔ | § | ✘ | ✘ | ✔ | ✔ | ✘ | ✔ | ✘ |
MqttWk | ✔ | ✔ | ✔ | ✔ | ✔ | ? | ✔ | ✔ | ✔ | ✔ | ✘ |
RabbitMQ | ✔ | ✔ | ✘ | ✔ | ✘ | ✘ | ✔ | ✔ | ? | ? | ? |
RSMB | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | ✔ | ✘ | ✘ | ? |
Software AG Universal Messaging | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ | ✔ | ✔ | ✔ | rm | ✘ |
Solace | ✔ | ✔ | ✘ | ✔ | § | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ |
SwiftMQ | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | ✔ | ✔ | ✔ | ✘ | ✔ |
Trafero Tstack | ✔ | ✔ | ✔ | ✔ | ✘ | ✘ | ✔ | ✔ | ✘ | ✘ | ✘ |
VerneMQ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
WebSphere MQ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ? | ? | ? |
我們可以看到目前已經有很多mqtt的broker了,因爲技術儲備是影響我們決策最重要的一個因素並且人力也較爲充足,所以我們選擇了java開發的Moquette爲研究對象,其中基於erlang語言的EMQTT,基於cpp的Mosquitto也是經常使用的兩種mqtt broker.