EMQ X 與 RabbitMQ 消息服務器 MQTT 性能對比(上)

本文素材來源於 RabbitMQ Summit 2019 會議上 Erlang Solutions 工程師 Grigory Starinkin 的發言內容。原內容主要對 MQTT 消息服務器 EMQ XRabbitMQ 進行了介紹及壓力測試對比。在此基礎上,我們對其進行了補充,深入分析了 EMQ X 以及 RabbitMQ 的在覈心架構上的側重,並據此分析了它們爲 MQTT 集羣模式表現帶來的不同影響。

MQTT 協議 - 訂閱和發佈

MQTT 是一個非常輕量級的訂閱和發佈協議,現在已經是物聯網領域最具統治地位和使用最廣泛的傳輸協議。MQTT 協議每個消息最少僅需 2 個字節 (其中報頭僅需 1 個字節,其餘字節可以全部作爲消息載荷)就可以完成通信,專爲那些資源和空間有限、功耗敏感的硬件所打造。其主要模式是 Pub/Sub(發佈/訂閱),客戶端可以扮演兩個角色,一個角色是發佈者,其在連接到服務器之後將針對某個特定主題發送消息給服務器;另一個角色是訂閱者,可以訂閱感興趣的主題來接收其中的消息。訂閱者也可以使用通配符訂閱主題,這樣就可以一次訂閱多個不同的主題,還可以使用共享訂閱進行負載均衡分發。

以下圖片揭示了 MQTT 協議是如何運作的:

MQTT協議運作.png

目前市場上有很多 MQTT 客戶端 SDK,也有很多 MQTT Broker。EMQ X 和 RabbitMQ 是 Erlang 家族中具有代表性的兩大開源消息服務器,我們接下來將針對 MQTT 場景對其進行深入對比。

EMQ X 與 RabbitMQ

EMQ X 是基於高併發的 Erlang/OTP 語言平臺開發,支持百萬級連接、分佈式集羣架構、發佈訂閱模式的開源 MQTT 消息服務器。開源至今,EMQ X 在全球物聯網市場得到了廣泛應用。在開源版基礎上,還陸續發展了商業版和提供雲版本(cloud-hosting)(https://www.emqx.com/zh/cloud)。EMQ X 支持很多插件,具有強大拓展能力,用戶依靠插件可以實現更多的功能。

RabbitMQ 是實現了高級消息隊列協議(AMQP)的開源消息代理軟件(亦稱面向消息的中間件)。RabbitMQ 服務器也是基於 Erlang 語言開發的,現在可以通過插件配置的形式,使其支持 MQTT 協議。

不難發現,他們都選用了 Erlang 作爲開發語言,並且他們都使用了 Erlang 語言攜帶的分佈式數據庫管理系統 —— Mnesia。Mnesia 適用於交換路由拓撲和在集羣之內的節點之間交換信息。

壓力測試

MQTT 服務器在實際使用中的性能通常被用戶作爲判斷一個服務器好壞的標準,因此本次評測也將重點關注這兩個服務器在壓力測試下的性能測試結果。

測試工具

本次壓力測試的工具選用了 MZBench。MZBench(https://github.com/mzbench/mzbench) 是一個使用 Erlang 語言寫的測試工具。它具有以下三個類型的節點:

  • MZSever:可以用來創建場景(scenarios),例如創建一個發佈者和多個訂閱者。這些信息會作爲服務器傳送至 MZBench;
  • MZController:從服務器產生的信息會進一步被傳送到這裏;
  • MZNodes:它們會作爲 MQTT 客戶端來連入你的集羣,如下圖所示。

MZBench測試工具.png

這次評測使用了一個雲主機 M5 large 的實例,每個 MQTT 消息服務器集羣由 3 個節點組成,每個節點的配置是雙核,8GB 內存。需要強調的是,我們對於 EMQ X 和 RabbitMQ 的測試使用了完全一致的硬件資源以消除變量。所有這些都配備了 Prometheus 節點導出器用於將指標推送到 Prometheus,並由 Grafana 進行最後的數據收集。

測試場景

壓力測試將會有兩個場景,「多對一」 和 「一對多」。

多對一

許多設備作爲發佈者,如溫度傳感器或者是壓力傳感器,發送數據給一個服務器。服務器再將這些數據發送給一個控制器(即訂閱者)處理這些數據。

測試場景多對一.png

一對多

一個控制器作爲發佈者將消息傳送給服務器,再由服務器將這些消息傳送給多個作爲訂閱者的設備。

測試場景一對多.png

在每個場景裏,「多」的那一方的數量將會從 2000 個逐漸上升到 10000 個。每個場景裏,每一秒會發送一條載荷爲 256 字節的消息。這樣的發佈並不會造成過大的吞吐量。僅僅使用 256 字節載荷是爲了展示出這兩個服務器的工作原理,以及他們的集羣模式如何對這些場景作出反應的。

測試結果

左側Y軸是指 CPU 佔用,底部X軸是指「多」側的客戶端數量變化。

多對一

從 「多對一」 的結果可以看出,EMQ X 和 RabbitMQ 相比並沒有太大差別。

多對一測試結果.png

一對多

但是從「一對多」的結果來看,RabbitMQ 相比於 EMQ X 確實有很明顯的差距。

一對多測試結果.png 造成這種差距的原因是什麼?我們將在下篇內容中詳細解析具體原因。

版權聲明: 本文爲 EMQ 原創,轉載請註明出處。

原文鏈接:https://www.emqx.com/zh/blog/emqx-or-rabbitmq-part-1

技術支持:如對本文或 EMQ 相關產品有疑問,可訪問 EMQ 問答社區 https://askemq.com 提問,我們將會及時回覆支持。

更多技術乾貨,歡迎關注我們公衆號【EMQ 中文社區】。

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