MQTT Broker 比較與選型——開源與商業服務器/服務對比
開源 MQTT Broker 對比
截止 2021 年,物聯網行業裏可選的MQTT Broker有很多,除了經典的Mosquitto和AWS、Azure,百度雲、阿里雲、IBM等幾個提供物聯網MQTT接入服務的產品外,可用於商業生產的MQTT Broker還有多款。
本文選取了幾個熱門開源的 MQTT Broker,其中部分項目提供商業支持,做簡單選型對比。
開源主推 EMQX 中文資料很豐富,近期某培訓機構出了一個系列視頻課程,推薦:https://www.bilibili.com/video/BV1o5411E7V1
對比項目 | EMQ | HiveMQ | VerneMQ | ActiveMQ | Mosquitto
|
---|---|---|---|---|---|
License
|
開源+商業版 | 開源+商業版 | 開源+商業版 | 開源 | 開源 |
公司/社區 | EMQ | HiveMQ | VerenMQ | Apache 基金會 | Eclipse 基金會 |
開源協議 | Apache License 2.0 | Apache License 2.0 | Apache License 2.0 | Apache License 2.0 | EPL/EDL licensed |
開發團隊 | 杭州映雲科技有限公司 | dc-square 股份有限公司,德國 | Octavo Labs AG,瑞士 | Apache 項目維護者 | Eclipse 開源社區 |
開發語言 | Erlang | Java | Erlang | Java | C |
項目歷史 | 2012年開始開源,2016年開始商業化 | 2013 年成立,一直以閉源方式向客戶提供軟件,2019 年開源 | 提供基於開源的商業化定製服務 | 2004 由 LogicBlaze 創建;原本規劃的 ActiveMQ 的下一代開源項目 Apollo 已經不活動(4年沒有代碼更新) | |
集羣架構 | 支持 | 僅企業版 | 支持 | 支持 | 不支持(有僞集羣實現) |
系統部署 | 物理機、虛擬機、K8S | 物理機、虛擬機、K8S | 物理機、虛擬機、K8S | 物理機、虛擬機、容器 | 物理機、虛擬機、容器 |
支持協議 | MQTT、CoAP、MQTT-SN、WebSocket、TCP、UDP、LwM2M | MQTT | MQTT | JMS、Openwire、Stomp、AMQP、MQTT、WebSocket XMPP | MQTT、WebSocket |
系統性能 | 單機性能較高,單機支持百萬級併發,集羣支持千萬級併發 | 集羣支持千萬級併發 | 集羣支持百萬級併發 | 支持集羣 | 單機10W |
MQTT | v3.1,v3.1.1,v5.0 | v3.1,v3.1.1,v5.0 | v3.1,v3.1.1,v5.0 | v3.1 | v3.1,v3.1.1,v5.0 |
邊緣計算 | EMQ X Edge 支持樹莓派,ARM 等架構,支持數據同步到雲服務 Azure IoT Hub AWS | 不支持 | 不支持 | 不支持 | 支持(自身比較輕量) |
安全與認證 | TLS/DTLS、X.509證書、JWT、OAuth2.0、應用協議(ID/用戶名/密碼)、數據庫與接口形式的認證與 ACL 功能(LDAP、DB、HTTP) | TLS/DTLS、X.509證書、JWT、OAuth2.0、應用協議(ID/用戶名/密碼)、配置文件形式的認證與 ACL 功能 | TLS/DTLS、X.509證書、配置文件形式的認證與 ACL 功能、數據庫形式的認證與 ACL 功能,但支持數據庫較少 | LDAP (JAAS)、Apache Shiro | 等待 |
運行持久化 | 支持將消息數據持久化至外部數據庫如 Redis、MySQL、PostgreSQL、MongoDB、Cassa、Dynamo 等,需企業版,開源版宕機則丟失 | 開源企業均支持本地持久化,採用磁盤系統,支持備份,導出備份 | 支持持久化至 Google LevelDB | AMQ、KahaDB、JDBC、LevelDB | 等待 |
擴展方式 | Webhook、Trigger、Plugin 等,支持 Erlang 與 Lua、Java、Python 擴展開發,支持 Webhook 開發,侵入性不強 | Trigger、Plugin 等,使用 Java 技術棧開發,提供方便開發的 SDK | Trigger、Plugin 等,支持 Erlang 與 Lua 擴展開發 | Java 擴展 | 等待 |
數據存儲 | 僅企業版適配數據庫:Redis、Mysql、PostgreSQL、MongoDB、Cassandra、OpenTSDB、TimescaleDB、InfluxDB 適配消息隊列:Kakfa、RabbitMQ、Pulsar 橋接模式:支持橋接至標準 MQTT 協議消息服務 開源版支持 HTTP 將數據同步、存儲 |
適配數據庫:無,提供 Java SDK 開發進行適配 消息隊列:Kafka 橋接模式:支持橋接至標準 MQTT 協議消息服務 |
適配數據庫:無,提供 Erlang 和 Lua 擴展開發 適配消息隊列:無 橋接模式:支持橋接至標準 MQTT 協議消息服務 | 適配數據庫:JDBC、KahaDB、LevelDB 適配消息隊列:無 橋接模式:支持通過 JMS 橋接 | 等待 |
管理監控 | 支持可視化的 Dashboard,實現集羣與節點的統一集中管理 支持第三方監控工具 Prometheus ,提供可視化 Grafana 界面模板 | 支持可視化的 HiveMQ Control Center,實現集羣與節點統一管理 支持第三方監控工具 Prometheus ,可提供可視化 Grafana 界面 支持 InfluxDB 監控 | 內置簡單狀態管理可視化界面 支持第三方監控工具 Prometheus ,可提供可視化 Grafana 界面 | 支持可視化的監控界面 支持第三方監控工具 Prometheus ,可提供可視化 Grafana 界面 | 通過 MQTT 訂閱系統主題 |
規則引擎 | 支持規則引擎,基於 SQL 的規則引擎給予 Broker 超越一般消息中間件的能力。除了在接受轉發消息之外,規則引擎還可以解析消息的格式(企業版)。 規則引擎由消息的訂閱,發佈,確認的事件觸發,根據消息的負載來執行相應的動作,降低應用開發的複雜度。 |
不支持 | 不支持 | 不支持 | 不支持 |
開發集成 | 支持通過 REST API 進行常用的業務管理操作如: 調整設置、獲取 Broker 狀態信息、進行消息發佈、代理訂閱與取消訂閱、斷開指定客戶端、查看客戶端列表、規則引擎管理、插件管理,提供 Java SDK、Python SDK 直接編碼處理業務邏輯 | 無,提供 Java SDK 在應用系統在編碼的層面操作進程,非常靈活但耦合性高 | 提供少量 REST API,用於監控與狀態管理、客戶端管理等。 缺乏代理訂閱、業務管理等功能和 API | 提供少量隊列管理 REST API | 等待 |
適用場景 | 優勢在於高併發連接與高吞吐消息的服務能力,以及物聯網協議棧支持的完整性;擴展能力較強,無需過多開發 | 有一定高併發連接與高吞吐消息的服務能力,物聯網協議棧的完整性較弱僅支持 MQTT 協議;缺乏開箱即用的功能插件,功能必須編碼使用 | 基礎的併發連接與高吞吐消息的服務能力,物聯網協議棧的完整性較弱僅支持 MQTT 協議;擴展能力較差,基礎的業務組件支持度不夠,商業成熟度不足客戶量較少,缺乏開箱即用的功能插件 | 核心是消息隊列系統,主要用於支持異構應用之間的消息通信,比如用於企業消息總線等;後面支持了部分物聯網協議。ActiveMQ 比較適合系統既要支持傳統的異構應用之間需要通信,也需要支持小型物聯網接入支持的用戶。 | 輕量簡便的 MQTT Broker,工控、網關或小規模接入項目 |
性能測試對比
MQTT Broker 性能測試對比,包含快速使用的測試工具。
- MQTTBox 客戶端工具提供了一個 MQTT 連接與性能測試功能,但是這個是基於 JS 來做的且比較簡單,功能與性能都一般。
-
EMQ 提供了一個性能測試工具 emqtt-benck,採用 Erlang 編寫,在 MacBook 2015款上能跑出 2K 連接,10K消息吞吐,把電腦壓榨到死機,適合來做 MQTT Broker 性能測試。
- 連接:指定連接數、連接速率,測試 MQTT Broker 的連接性能(速率、響應時間、錯誤數)
- 訂閱:指定連接數、主題數、訂閱速率,QoS、測試 MQTT Broker 的訂閱性能(速率、響應時間、錯誤數)
- 發佈:指定連接數、消息發佈速率、消息大小、QoS,測試 MQTT Broker 的消息吞吐性能(速率、響應時間、錯誤數)
-
開源性能測試框架 JMeter 也有 MQTT 性能測試的功能,基於此的 XMeter 提供性能測試商業服務。
性能測試場景
此處採用 HiveMQ 提供的 broker.hivemq.com 在線服務器作爲測試 Broker,場景如下:
- 消息發佈吞吐:1000ms/10ms * 100 連接 = 10K/秒
- 消息轉發吞吐:100 連接 1 訂閱 10K/s = 1000K = 100W
下圖爲結果,HiveMQ 應該是做了相應的限制,PUB 測試會報錯,實際測試自己的 MQTT Broker 性能時應當按需調節。
下載安裝測試工具
git clone https://github.com/emqx/emqtt-bench.git
|
MQTT 連接性能測試
建立 100 個客戶端連接
./emqtt_bench conn -c 100 -h broker.hivemq.com
|
MQTT 訂閱性能測試
建立 100 個客戶端連接,每 10ms 建立一個連接,每個連接均訂閱 testtopic/# 主題,QoS 爲 2
./emqtt_bench sub -c 100 -i 10 -t testtopic/# -q 2 -h broker.hivemq.com
|
MQTT 發佈性能測試
建立 100 個客戶端連接,每 10ms 建立一個連接,每個連接 10ms 發佈一次消息,每個連接均向 testtopic/${clientid} 主題發佈消息,單條消息尺寸爲 256 Bytes,消息 QoS 爲 2
./emqtt_bench pub -c 100 -i 10 -I 10 -t testtopic/%i -s 256 -q 2 -h broker.hivemq.com
|
MQTT Broker 職責與需求
消息隊列與消息中間件適用場景不一樣。
MQTT 與消息隊列有一定的區別,隊列是一種先進先出的數據結構,消息隊列常用於應用服務層面,實現參考如 RabbitMQ Kafka RocketMQ;
MQTT 是傳輸協議,絕大部分 MQTT Broker 不保證消息順序(Queue),常用語物聯網、消息傳輸等,MQTT Broker 的常見需求可參考:共享行業的分佈式 MQTT 設計
消息隊列與MQTT異同
場景 | 部署端 | MQTT | 消息隊列 |
---|---|---|---|
設備端上報狀態數據、設備通信 | 移動終端 | √ | × |
接收並處理分析設備的上報數據 | 移動終端 | × | √ |
對多個設備下發控制指令 | 服務器 | × | √ |
直播、彈幕、聊天 App 收發消息 | 應用 | √ | × |
服務端接收並分析聊天消息 | 服務器 | × | √ |
客戶端連接數 | 客戶端規模龐大,百萬甚至千萬級 | 一般服務器規模較小,極少數萬級 | |
單客戶端消息量 | 單個客戶端需要處理的消息少,一般定時收發消息 | 單個客戶端處理消息量大,注重吞吐量 |
EMQ X Docker 安裝
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8083:8083 -p 8084:8084 -p 18083:18083 emqx/emqx
|
啓動之後打開 http://localhost:18083
EMQ X Dashboard 默認用戶名密碼:
用戶名:admin
密碼:public
HiveMQ Docker 安裝
docker run -p 8080:8080 -p 1883:1883 -p 8083:8083 hivemq/hivemq4
|
啓動之後打開 http://localhost:8080
HiveMQ 默認用戶名密碼:
用戶名:admin
密碼:hivemq
VerneMQ Docker 安裝
docker run -p 1883:1883 -e "DOCKER_VERNEMQ_ACCEPT_EULA=yes" --name vernemq1 -d vernemq/vernemq
|
Mosquitto Docker 安裝
docker run -it --name=mosquitto -p 1883:1883 -p 9001:9001 -d eclipse-mosquitto
|
9001 是 Mosquitto WebSocket 端口。
全部 MQTT Broker 與 MQTT 服務列表
- EMQ X. Scalable and Reliable Real-time MQTT 5.0 Message Broker for IoT in 5G Era.
- Adafruit IO
- HiveMQ
- ActiveMQ
- ActiveMQ Artemis
- RabbitMQ
- Mosquitto
- flespi
- IBM MessageSight
- Mosca. More recently by the same author: Aedes
- MQTT Dashboard
- Eclipse IoT
- VerneMQ
- Solace
- CloudMQTT
- Wave
- vertx-mqtt-broker
- JoramMQ
- Moquette MQTT
- MQTTnet. Embedded MQTT broker, C#
- MyQttHub
- Jmqtt