MQTT Broker 比較與選型——開源與商業服務器/服務對比

MQTT Broker 比較與選型——開源與商業服務器/服務對比

 

開源 MQTT Broker 對比

截止 2021 年,物聯網行業裏可選的MQTT Broker有很多,除了經典的Mosquitto和AWS、Azure,百度雲、阿里雲、IBM等幾個提供物聯網MQTT接入服務的產品外,可用於商業生產的MQTT Broker還有多款。

本文選取了幾個熱門開源的 MQTT Broker,其中部分項目提供商業支持,做簡單選型對比。

開源主推 EMQX 中文資料很豐富,近期某培訓機構出了一個系列視頻課程,推薦:https://www.bilibili.com/video/BV1o5411E7V1

 
對比項目EMQHiveMQVerneMQActiveMQMosquitto
 
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 性能時應當按需調節。

image-20200623175355400

下載安裝測試工具

git clone https://github.com/emqx/emqtt-bench.git

cd emqtt-bench

./emqtt-bench sub --help

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 服務列表

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