引言
物聯網開發者需要為自己的物聯網專案選擇合適的 MQTT 訊息產品或服務,從而構建可靠高效的基礎資料層,保障上層物聯網業務。目前市面上有很多開源的 MQTT 產品,在效能功能等方面各有優點。本文將選取目前最為流行的兩個開源 MQTT Broker:EMQX 和 Mosquitto,從技術架構、效能、功能、社群情況等多維度進行 1v1 對比,幫助讀者更加深入瞭解這兩個產品。
Mosquitto 簡介
Mosquitto 專案最初由 IBM 和 Eurotech 於 2013 年開發,後來於 2016 年捐贈給 Eclipse 基金會。Eclipse Mosquitto 基於 Eclipse 公共許可證(EPL/EDL license)釋出,使用者可以免費使用。作為全球使用最廣的 MQTT 協議實現之一 ,截至 2023 年 3 月,Mosquitto 的 GitHub Star 數超過了 7.1 K。
Mosquitto 用 C/C++ 編寫,採用單執行緒架構。Mosquitto 支援 MQTT 協議的 5.0、3.1.1 和 3.1 版本,同時支援 SSL/TLS 和 WebSockets。輕量級設計使其適合部署在嵌入式裝置或資源有限的伺服器上。
優點:
- 易於安裝使用
- 支援 MQTT 5.0 協議
- 輕量高效
- 積極的社群支援
缺點:
- 可擴充套件性有限(<100k)
- 沒有叢集支援
- 缺少企業功能
- 有限的雲原生支援
EMQX 簡介
EMQX 專案於 2012 年底在 Github 釋出,許可證為 Apache2,如今已成為世界上最具擴充套件性的 MQTT 訊息伺服器,被廣泛應用於物聯網、車聯網、工業物聯網等各類關鍵業務場景。
EMQX 採用 Erlang/OTP 編寫,這是一種用於構建大規模可擴充套件軟實時系統的程式語言。與 Mosquitto 不同,EMQX 在設計之初即採用了分散式叢集架構,可以輕鬆實現彈性水平擴充套件,從而穩定承載大規模的 MQTT 客戶端接入。最新版本 EMQX 5.0 可在 23 個節點的單叢集中建立 1 億個併發的 MQTT 連線。
優點:
- 支援大規模部署
- 高可用性
- 橫向可擴充套件性
- 高效能和高可靠
- 豐富的企業功能
- 率先採用 MQTT over QUIC
缺點:
- 上手複雜
- 難以有效管理
社群情況
EMQX 是 GitHub 上評價最高、最活躍的 MQTT Broker 專案,在過去 12 個月裡有 11.4K 個 Star 和超過 3000 個 Commit。
Mosquitto 以其輕量級的單執行緒架構在部署上比 EMQX 更普遍,特別是在資源有限的嵌入式裝置上。
注:Mosquitto 專案最初由 Roger Light 在 2008 年建立,後來在 2013 年被 Eclipse 基金會接收。
效能與可擴充套件性
Mosquitto 作為一個輕量級 MQTT 訊息中介軟體有著比較優秀的單節點效能,單機可以支撐 10w 級別的裝置併發連線。但不支援叢集架構。
EMQX 作為可叢集部署的大規模訊息伺服器,單節點可以支援百萬級併發連線,單叢集支援億級併發連線。但 CPU 和記憶體使用率更高。
EMQX 是如何支援單叢集億級 MQTT 併發連線的?點選檢視詳細測試過程 →
協議支援
Mosiquitto 作為 MQTT Broker 提供了完整的 MQTT 3.1/3.1.1/5.0 協議支援,支援協議規範中的遺囑訊息、保留訊息、共享訂閱等能力,同時也支援 MQTT over WebSocket,可以滿足大多數 MQTT 裝置接入需求。
EMQX 同樣完整支援 MQTT 3.1/3.1.1/5.0 以及 MQTT over Websocket 協議。同時 EMQX 5.0 開創性地引入了下一代網際網路協議 HTTP/3 的底層傳輸協議 QUIC 的支援,以解決複雜網路環境下的通訊問題,提升整體吞吐量和移動連線的穩定性。此外,EMQX 也擴充套件支援 MQTT-SN、CoAP、LwM2M、STOMP 以及其他協議擴充套件。
安全性
安全性對於物聯網裝置連線以及裝置之間、裝置與雲服務之間的資料交換至關重要。Mosquitto 和 EMQX 都支援基於 TLS/SSL 的安全連線。此外,EMQX 還支援 QUIC 傳輸、OCSP Stapling、Audit Logs 和 Black Duck 原始碼掃描。
認證與鑑權
在客戶端認證許可權與訪問控制方面,Mosiquitto 提供了動態安全外掛,透過靈活的方式處理使用者名稱/密碼身份驗證和訪問控制。Mosiquitto 支援匿名與使用者名稱密碼方式認證,並可以透過動態安全外掛提供的自定義組群和角色的方式控制訊息主題的訪問許可權。
EMQX 支援多種認證機制,如使用者名稱密碼認證、JWT 認證以及基於 MQTT 5.0 協議的增強認證。EMQX 支援與多種資料儲存方式整合,包括內建資料庫、檔案、MySQL、PostgreSQL、MongoDB 和 Redis。
此外,EMQX 為使用者提供了黑名單功能,使用者可以透過 Dashboard 和 HTTP API 將指定客戶端加入黑名單以拒絕該客戶端訪問,除了客戶端識別符號以外,還支援直接封禁使用者名稱甚至 IP 地址,方便使用者靈活管理客戶端的連線與訪問。
資料整合
Mosquitto 預設透過 MQTT 客戶端訊息訂閱方式實現外部系統對資料的消費。此外,Mosquitto 提供了多個 Mosquitto 之間的資料橋接能力,可以用於多個 broker 之間的分散式部署與資料打通。
EMQX 在資料整合方面提供了 WebHook 方式將客戶端訊息和事件推送到外部系統中。EMQX 也同樣提供了類似於 Mosquitto 的 MQTT 資料橋接功能,可以連線多個 EMQX 叢集或其他標準 MQTT 服務。EMQX 在企業版中重點增強了資料整合能力。EMQX 企業版可以透過規則引擎對接各類主流型資料庫、訊息佇列以及雲服務,在資料可靠性與架構設計靈活性上大大增強。
規則引擎
為了使用者更加方便地實現高效能資料預處理與基於業務需求的資料路由,EMQX 內建了基於 SQL 的規則引擎元件,搭配資料橋接使用,無需編寫程式碼即可實現一站式的 IoT 資料提取、過濾、轉換、儲存與處理,以加速應用整合和業務創新。
可操作性與可觀測性
Mosquitto 提供了基本的日誌和除錯功能,用於監控代理狀態和故障排除。然而,它缺乏先進的管理和監控功能,使使用者難以從其執行狀態獲得更多洞察進行效能最佳化。
EMQX 透過 HTTP API 和 Dashboard 提供豐富和視覺化的監控功能,使其更容易監控和管理。此外,EMQX 支援與 Prometheus、StatsD 和Datadog 的整合,使運維團隊能夠輕鬆使用第三方監控平臺。
雲原生部署與 K8s 支援
Mosquitto 支援基於 docker 的容器化部署。EMQX 在此基礎上提供了基於 Kubernetes Operator 和 Terraform 雲原生自動部署能力,更加方便在容器環境下的部署與運維。
EMQX Kubernetes Operator: 點選檢視
橋接 Mosquitto 到 EMQX
雖然 EMQX 和 Mosquitto 作為 MQTT Broker 有著很多不同之處,但它們可以透過 MQTT 橋接的方式實現完美結合。
我們可以在物聯網邊緣的嵌入式硬體或閘道器上部署 Mosquitto,實現小規模邊緣資料接入,然後透過橋接方式與雲端的 EMQX 整合,實現大規模的雲端資料匯聚接入。
橋接 Mosquitto MQTT 訊息至 EMQX
結語
透過以上對比,我們可以看出:Mosquitto 作為單節點的輕量級 MQTT 訊息中介軟體,更加適合部署在工業閘道器、工控機、小型伺服器中,實現中小規模的 MQTT 裝置連線場景下快速高效的資料接入與訊息路由。而 EMQX 作為支援高可用叢集的大規模 MQTT 訊息伺服器,更適合部署在資料中心、公有云或私有云環境,為較大規模資料接入以及對高可用有需求的使用者提供服務。
您可以選擇 Mosquitto 用於嵌入式硬體和 IoT 邊緣部署,並使用 EMQX 作為雲中高度可擴充套件、高可用的 MQTT 訊息服務。
此外,對於有更大規模裝置連線與大吞吐資料接入需求,且對資料完整性、資料持久化以及資料整合靈活性有較高要求的使用者,我們建議您使用 EMQX 企業版本。
版權宣告: 本文為 EMQ 原創,轉載請註明出處。
原文連結:https://www.emqx.com/zh/blog/emqx-vs-mosquitto-2023-mqtt-broker-comparison