EMQX vs Mosquitto｜2023年MQTTブローカーの比較

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/7deaff23-411b-5fa8-20ff-76a0094f8283.png)

## はじめに

MQTT（Message Queuing Telemetry Transport）は、IoT（Internet of Things）のデファクトスタンダードなメッセージングプロトコルである。IoTの発展に伴い、[**MQTTブローカー**](https://www.emqx.com/en/blog/the-ultimate-guide-to-mqtt-broker-comparison)はIoT機器の接続や、接続された機器とクラウドサービス間のデータ移動に不可欠になっています。

[**EMQX**](https://www.emqx.io/)と[**Mosquitto**](https://mosquitto.org/)は、最も人気のあるオープンソースのMQTTブローカーの2つです。EMQXは、拡張性の高い分散型MQTTブローカーで、クラスタリングをサポートしています。Mosquittoは、フットプリントが小さく、シングルスレッド・アーキテクチャの軽量なMQTTブローカーです。

このブログ記事では、2023年の2つのブローカーを詳細に比較します。

## Mosquittoの概要

Mosquittoプロジェクトは、2009年にRoger Lightによって最初に開発され、その後Eclipse Foundationに寄贈され、Eclipse Public License（EPL/EDLライセンス）の下でライセンスされています。世界で最も広く使われているMQTTブローカーの1つとして、Mosquittoは2023年3月現在で7k以上のGitHubスターを持っています。

MosquittoはC/C++で書かれており、シングルスレッド・アーキテクチャを使用しています。MosquittoはMQTTプロトコルバージョン5.0、3.1.1、3.1を実装し、SSL/TLSとWebSocketをサポートしています。軽量設計のため、Mosquittoは組み込み機器やリソースの限られたサーバーへの導入に適しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/4310d9c4-716d-fc4b-ea67-5c0a10fdca29.png)

**長所です：**

* 簡単な設定と使用方法
* MQTT 5.0プロトコル対応
* 軽量で効率的
* 積極的なコミュニティサポート  
**Cons：**
* 拡張性が低い（10万人未満）
* クラスタリングサポートなし
* エンタープライズ向け機能を欠く
* Cloud-Nativeのサポートは限定的です。

## EMQXの概要

EMQXプロジェクトは2012年にGitHubで開始され、Apacheバージョン2.0の下でライセンスされています。EMQXは現在、MQTT 5.0、MQTT-SN、MQTT over QUICなどの先進機能をサポートする、世界で最もスケーラブルなMQTTメッセージングサーバーです。IoT、産業用IoT（IIoT）、車両インターネット（IoV）のビジネスクリティカルなアプリケーションで広く利用されています。

EMQXは、大規模スケーラブルなソフトリアルタイムシステムを構築するためのプログラミング言語であるErlang/OTPで書かれています。EMQXは、Mosquittoとは異なり、設立当初からマスターレス分散アーキテクチャを採用し、高可用性と水平スケーラビリティを実現しています。最新版のEMQX 5.0では、23ノードの単一クラスターで1億の同時MQTT接続を確立する規模となっています。

ご覧ください：[**EMQX 5.0による100M MQTT接続の達成**](https://www.emqx.com/en/blog/reaching-100m-mqtt-connections-with-emqx-5-0)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/41cc3ed6-e2f5-68ac-d79f-275d79651733.png)

**長所です：**

* 大規模なデプロイメントに対応
* 高可用性
* 水平方向のスケーラビリティ
* 高性能・高信頼性
* 豊富なエンタープライズ機能
* MQTT over QUICの先駆け。  
**Cons：**
* 設定や構成が複雑
* 効果的なマネジメントが難しい
* ログが乱れる場合があります

## コミュニティとポピュラリティ

[**EMQX**](https://github.com/emqx/emqx)はGitHubで最も評価が高く、最もアクティブなMQTT Brokerプロジェクトで、過去12ヶ月で11.4スター、3,000以上のコミットが行われています。

[**Mosquitto**](https://github.com/eclipse/mosquitto)は、軽量なシングルスレッドアーキテクチャを持つEMQXよりも、特にリソースの限られた組込み機器での導入が進んでいるようです。

![コミュニティと人気者（2023年3月24日）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/cb9f0429-0f45-0cd1-c74a-6367b80a339c.png)

## スケーラビリティとパフォーマンス

Mosquittoは軽量なMQTTブローカーとして、クラスタリングアーキテクチャをサポートしませんが、シングルノードのパフォーマンスは優れています。小さなリソースフットプリントのサーバーで、100kを超える同時MQTT接続をサポートすることができます。

EMQXは、拡張性の高い分散型MQTTメッセージングブローカーとして、単一ノードで数百万、単一クラスタで1億の同時接続をサポートできますが、CPUとメモリの使用量ははるかに高くなります。

ご覧ください：EMQX vs Mosquitto パフォーマンスベンチマークレポートをご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/177839be-a096-c182-522f-83a6b5d8acf9.png)

## MQTTとコネクティビティ

Mosiquittoは、MQTTプロトコルバージョン3.1/3.1/5.0を実装し、意志メッセージ、保持メッセージ、共有サブスクリプションなどのプロトコル仕様をサポートし、MQTT over WebSocketをサポートします。

EMQXは、MQTT 3.1/3.1/5.0と[**MQTT over Websocket**](https://www.emqx.com/en/blog/connect-to-mqtt-broker-with-websocket)プロトコルを完全にサポートしています。EMQX 5.0では、[**MQTT Over QUIC**](https://www.emqx.com/en/blog/mqtt-over-quic)の画期的なサポートも導入しています。多重化、接続確立と移行の高速化により、次世代のMQTT標準となる可能性を秘めています。

さらにEMQXは、MQTT-SN、CoAP、LwM2M、STOMPといった複数のプロトコルゲートウェイをサポートするように拡張することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/dd2a4787-76e8-93ad-bfda-7d52e1d22b7a.png)


## セキュリティ

IoTデバイスの接続や、接続されたデバイスとクラウドサービス間でやり取りされるデータには、セキュリティが重要です。MosquittoとEMQXはともに、TLS/SSLに基づくセキュアな接続をサポートしています。さらにEMQXは、QUICトランスポート、OCSPステープリング、監査ログ、Black Duckによるソースコードスキャンをサポートしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/dfa7151d-9355-6e64-3d0e-b27709eb3c44.png)

## 認証と認可

MQTTクライアントの認証やアクセス制御については、Mosiquittoが提供するダイナミックセキュリティプラグインにより、ユーザー名/パスワードによる認証やアクセス制御を柔軟に対応することができます。

EMQXには、[**ユーザー名-パスワード認証**](https://www.emqx.com/en/blog/securing-mqtt-with-username-and-password-authentication)、JWT認証、MQTT 5.0プロトコルに基づく拡張認証など、複数の認証メカニズムに対するサポートが組み込まれています。EMQXの認証は、ファイル、Redis、MySQL、PostgreSQL、MongoDBなど、さまざまなデータバックエンドと統合されています。

また、EMQXはフラッピング検知やブロックリスト機能を備えており、DashboardやHTTP APIを介して、IPアドレス、clientId、ユーザー名をブロックリストに追加することで、特定のクライアントをブロックすることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/61a40dd4-47eb-d767-4240-16aa38830075.png)

## データインテグレーション

軽量ブローカーであるMosquittoは、データ統合をサポートしません。ユーザーは、MosquittoからMQTTメッセージを消費して、外部のデータベースやクラウドサービスに取り込むためのコードを書くことができます。

EMQXにはSQLベースのルールエンジンが組み込まれており、ブローカー内でリアルタイムにMQTTメッセージを抽出、フィルタリング、エンリッチ、変換するのに役立ちます。

EMQXのEnterprise Editionは、ルールエンジンとすぐに使えるデータブリッジを使って、Kafka、データベース、クラウドサービスとシームレスに統合することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/99af9b2e-07ba-6ed1-3250-7777845f3151.png)


## 操作性・観察性

Mosquittoは、ブローカーの状態を監視し、問題のトラブルシューティングを行うための基本的なロギングとデバッグ機能を備えています。しかし、高度な管理・監視機能がないため、実行中の状態を把握し、パフォーマンスを最適化することが困難です。

EMQXは、HTTP APIとDashboardを通じて、リッチでビジュアルな監視機能を提供し、監視と管理を容易にする。また、EMQXはPrometheusやDatadogとの連携をサポートしており、O&Mチームはサードパーティの監視プラットフォームを容易に利用することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/67ec4189-b938-19e5-10fb-766a1c9fbcf4.png)

## クラウドネイティブとKubernetes

EMQXとMosquittoは、どちらもDockerベースのコンテナ型デプロイメントをサポートしています。EMQXはKubernetes OperatorやTerraformのサポートに優れており、パブリッククラウドプラットフォームへのデプロイや運用が容易になります。

また、EMQXは、世界中のAWS、Google Cloud、Microsoft Azureの17以上のリージョンで、[**Serverless**](https://www.emqx.com/en/cloud/serverless-mqtt)、[**専用**](https://www.emqx.com/en/cloud/dedicated)、[**BYOC**](https://www.emqx.com/en/cloud/byoc)のMQTTメッセージングサービスを提供しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/35199fe4-98d0-881e-e701-e0c4b97c992b.png)

EMQX Kubernetes Operator: [**https://github.com/emqx/emqx-operator**](https://github.com/emqx/emqx-operator)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/75384141-4ebf-24b2-12eb-c58699af9e65.png)

## MosquittoからEMQXへのブリッジ接続

EMQXとMosquittoは全く異なるMQTTブローカーですが、MQTTブリッジングアプローチで完全に動作させることができます。

IoTエッジの組み込みハードウェアやゲートウェイにMosquittoを導入し、MQTTブリッジを介してクラウド上の大規模EMQXクラスタにIoTデータを集約・インジェストすることができます。

Mosquitto MQTTメッセージのEMQXへの橋渡し」を参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/3ce75861-775d-288b-baac-78850ed18337.png)

## まとめ

上記の比較から、EMQXとMosquittoは、異なるニーズやユースケースに対応する人気のMQTTブローカーであることがわかります。

Mosquittoは、シングルスレッドで軽量なMQTT Brokerとして、IoTエッジのための組み込みハードウェア、産業用ゲートウェイ、小型サーバーへの導入に適しています。

EMQXは、高可用性と水平方向のスケーラビリティをサポートする、拡張性の高い分散型MQTTサーバーです。クラウド展開、大規模なIoT、IIoT、コネクテッドカーなどのアプリケーションにより適しています。

つまり、組み込みハードウェアやIoTエッジのデプロイメントにはMosquittoを選び、クラウドではEMQXを大規模スケーラブルで高可用性のMQTTメッセージングサービスとして利用することができます。

## 参考文献

* [**Eclipse Mosquitto**](https://mosquitto.org/)
* [**Eclipse Mosquitto Documentation**](https://mosquitto.org/documentation/)
* [**EMQX: The World's #1 Open Source Distributed MQTT Broker**](https://www.emqx.io/)
* [**EMQX 5.0 Documentation**](https://www.emqx.io/docs/en/v5.0/)
* [**EMQX Enterprise Documentation**](https://docs.emqx.com/en/enterprise/v5.0/)
* [**EMQX Operator Documentation**](https://docs.emqx.com/en/emqx-operator/latest/)
* [**MQTT over QUIC: Next-Generation IoT Standard Protocol**](https://www.emqx.com/en/blog/mqtt-over-quic)

元々は [www.emqx.com](https://www.emqx.com/ja/blog/emqx-vs-mosquitto-2023-mqtt-broker-comparison) で公開されました