EMQX vs Mosquitto|2023年MQTTブローカーの比較
目次
はじめに
MQTT(Message Queuing Telemetry Transport)は、IoT(Internet of Things)のデファクトスタンダードなメッセージングプロトコルである。IoTの発展に伴い、MQTTブローカーはIoT機器の接続や、接続された機器とクラウドサービス間のデータ移動に不可欠になっています。
EMQXとMosquittoは、最も人気のあるオープンソースの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は組み込み機器やリソースの限られたサーバーへの導入に適しています。
長所です:
- 簡単な設定と使用方法
- 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接続の達成
長所です:
- 大規模なデプロイメントに対応
- 高可用性
- 水平方向のスケーラビリティ
- 高性能・高信頼性
- 豊富なエンタープライズ機能
MQTT over QUICの先駆け。
Cons:
設定や構成が複雑
- 効果的なマネジメントが難しい
- ログが乱れる場合があります
コミュニティとポピュラリティ
EMQXはGitHubで最も評価が高く、最もアクティブなMQTT Brokerプロジェクトで、過去12ヶ月で11.4スター、3,000以上のコミットが行われています。
Mosquittoは、軽量なシングルスレッドアーキテクチャを持つEMQXよりも、特にリソースの限られた組込み機器での導入が進んでいるようです。
EMQX | Mosquitto | |
---|---|---|
GitHub Project | EMQX GitHub | Mosquitto GitHub |
Project Created | 2012 | 2009 |
License | Apache License 2.0 | EPL/EDL License |
Programming Language | Erlang | C |
Latest Release | v5.0.21 (March 2023) | 2.0.15 (Aug 2022) |
GitHub Stars | 11.4k | 7.2 k |
GitHub Forks | 2k | 2.1k |
GitHub Commits | 14k+ | 2.8k+ |
GitHub Commits (Last 12 Months) | 3000+ | 500+ |
GitHub Issues | 3500+ | 2200+ |
GitHub Releases | 260+ | 60+ |
GitHub PRs | 6000+ | 600 |
GitHub Contributors | 100+ | 110+ |
コミュニティと人気者(2023年3月24日)
スケーラビリティとパフォーマンス
Mosquittoは軽量なMQTTブローカーとして、クラスタリングアーキテクチャをサポートしませんが、シングルノードのパフォーマンスは優れています。小さなリソースフットプリントのサーバーで、100kを超える同時MQTT接続をサポートすることができます。
EMQXは、拡張性の高い分散型MQTTメッセージングブローカーとして、単一ノードで数百万、単一クラスタで1億の同時接続をサポートできますが、CPUとメモリの使用量ははるかに高くなります。
ご覧ください:EMQX vs Mosquitto パフォーマンスベンチマークレポートをご覧ください。
EMQX | Mosquitto | 参考リンク | |
---|---|---|---|
スケーラビリティ | 1ノードあたり4M MQTTコネクション 1クラスタあたり100M MQTTコネクション |
<1ノードあたり160K MQTT接続数 | EMQX 5.0による100M MQTT接続の達成 |
パフォーマンス | ノードあたり200万QoS0 MQTT msgs/sec 800k QoS1 msg/秒 200k QoS2 msg/秒 |
ノードあたり最大120k QoS0 MQTT msg/秒 80k QoS1 msg/秒 60k QoS2 msg/秒 |
|
レイテンシー | 1桁ミリ秒のレイテンシーをスケールアップで実現 | シナリオによっては最大数秒のレイテンシーが発生します。 | |
クラスター化 | 20ノード以上のクラスタ | ❌ | クラスターのスケーラビリティ |
スケーリング | ✅ | ❌ | |
オートクラスタリング | ✅ | ❌ | EMQX ノードの発見とオートクラスター |
ダウンタイムゼロ/ホットアップグレード | ✅ | ❌ | リリースアップグレード |
MQTTとコネクティビティ
Mosiquittoは、MQTTプロトコルバージョン3.1/3.1/5.0を実装し、意志メッセージ、保持メッセージ、共有サブスクリプションなどのプロトコル仕様をサポートし、MQTT over WebSocketをサポートします。
EMQXは、MQTT 3.1/3.1/5.0とMQTT over Websocketプロトコルを完全にサポートしています。EMQX 5.0では、MQTT Over QUICの画期的なサポートも導入しています。多重化、接続確立と移行の高速化により、次世代のMQTT標準となる可能性を秘めています。
さらにEMQXは、MQTT-SN、CoAP、LwM2M、STOMPといった複数のプロトコルゲートウェイをサポートするように拡張することができます。
EMQX | Mosquitto | 参考リンク | |
---|---|---|---|
MQTT 3.1/3.1.1 | ✅ | ✅ | MQTTプロトコルのわかりやすい解説書 |
MQTT 5.0 | ✅ | ✅ | MQTT 5 エクスプロア |
MQTT Shared Subscription | ✅ | ✅ | |
MQTT Add-ons | 独占配信 ディレイパブリッシュ オートサブスクリプション トピックのリライト |
❌ | |
MQTT over TCP | ✅ | ✅ | EMQX入門編 |
MQTT over TLS | ✅ | ✅ | EMQX MQTTブローカーのSSL/TLSを有効化する。 |
MQTT over WebSocket | ✅ | ✅ | WebsocketでMQTTブローカーに接続する。 |
MQTT over QUIC | ✅ | ❌ | EMQXは現在、世界で唯一、QUICトランスポートをサポートするMQTTブローカーです。( MQTT over QUIC) |
LB (Proxy Protocol) | ✅ | ✅ | Proxy Protocol v1、v2(クラスターロードバランサー) |
IPv6 Support | ✅ | ✅ | |
Multi-protocol Gateway | ✅ | ❌ | Extended protocol gateway |
MQTT-SN | ✅ | ❌ | MQTT-SN gateway |
CoAP | ✅ | ❌ | CoAP protocol gateway |
LwM2M | ✅ | ❌ | LwM2M protocol gateway |
STOMP | ✅ | ❌ | STOMP Gateway |
セキュリティ
IoTデバイスの接続や、接続されたデバイスとクラウドサービス間でやり取りされるデータには、セキュリティが重要です。MosquittoとEMQXはともに、TLS/SSLに基づくセキュアな接続をサポートしています。さらにEMQXは、QUICトランスポート、OCSPステープリング、監査ログ、Black Duckによるソースコードスキャンをサポートしています。
EMQX | Mosquitto | 参考リンク | |
---|---|---|---|
TLS/SSL | ✅ | ✅ | EMQX: TLS 1.1, 1.2, 1.3 ( EMQX MQTT ブローカーの SSL/TLS を有効にする ) |
QUIC | ✅ | ❌ | MQTT over QUIC:次世代IoT標準プロトコル |
OCSP Stapling | ✅ | ✅ | EMQX OCSPステープリング対応 |
Audit ログ | ✅ | ❌ |
認証と認可
MQTTクライアントの認証やアクセス制御については、Mosiquittoが提供するダイナミックセキュリティプラグインにより、ユーザー名/パスワードによる認証やアクセス制御を柔軟に対応することができます。
EMQXには、ユーザー名-パスワード認証、JWT認証、MQTT 5.0プロトコルに基づく拡張認証など、複数の認証メカニズムに対するサポートが組み込まれています。EMQXの認証は、ファイル、Redis、MySQL、PostgreSQL、MongoDBなど、さまざまなデータバックエンドと統合されています。
また、EMQXはフラッピング検知やブロックリスト機能を備えており、DashboardやHTTP APIを介して、IPアドレス、clientId、ユーザー名をブロックリストに追加することで、特定のクライアントをブロックすることが可能です。
EMQX | Mosquitto | 参考リンク | |
---|---|---|---|
ユーザー名/パスワード | ✅ | ✅ | EMQX:AuthN の紹介 Mosquitto:認証方法について |
JWT | ✅ | ✅ | EMQX: JWT認証システム Mosquitto: mosquittoのAuthプラグイン。 |
MQTT 5.0 認証の強化 | ✅ | ❌ | SCRAM認証 |
PSK | ✅ | ✅ | SSL/TLS |
X.509証明書 | ✅ | ✅ | |
LDAP | ✅ | ✅ | LDAP認証/ACL |
きめ細かなアクセスコントロール | ✅ | ✅ | EMQXのオーソライズ |
認証用バックエンド | ✅ | ✅ | 認証の紹介 |
ACLデータベースバックエンド | ✅ | ✅ | EMQX:ファイル、MySQL、PostgreSQL、MongoDB、組込みデータベース、HTTP EMQX認証の紹介 |
フラッピングディテクト | ✅ | ❌ | |
ブロックリスト | ✅ | ❌ |
データインテグレーション
軽量ブローカーであるMosquittoは、データ統合をサポートしません。ユーザーは、MosquittoからMQTTメッセージを消費して、外部のデータベースやクラウドサービスに取り込むためのコードを書くことができます。
EMQXにはSQLベースのルールエンジンが組み込まれており、ブローカー内でリアルタイムにMQTTメッセージを抽出、フィルタリング、エンリッチ、変換するのに役立ちます。
EMQXのEnterprise Editionは、ルールエンジンとすぐに使えるデータブリッジを使って、Kafka、データベース、クラウドサービスとシームレスに統合することができます。
EMQX | Mosquitto | 参考リンク | |
---|---|---|---|
Webhook | ✅ | ✅ | Webhook |
Rule Engine | ✅ | ❌ | Rule Engine |
Message Codec | ✅ | ❌ | |
Data Bridge | ✅ | ❌ | Data bridges |
Confluent/Kafka | ✅ (Enterprise Edition) | ❌ | Stream Data into Kafka |
SAP Event Mesh | ✅(Enterprise Edition) | ❌ | Ingest Data into SAP Event Mesh |
Apache Pulsar | ✅(Enterprise Edition) | ❌ | Ingest Data into Pulsar |
RabbitMQ | ✅(Enterprise Edition) | ❌ | Ingest Data into RabbitMQ |
MySQL | ✅(Enterprise Edition) | ❌ | Ingest Data into MySQL |
PostgreSQL | ✅(Enterprise Edition) | ❌ | Ingest Data into PostgreSQL |
SQL Server | ✅(Enterprise Edition) | ❌ | Ingest Data into SQL Server |
MongoDB | ✅(Enterprise Edition) | ❌ | Ingest Data into MongoDB |
Redis | ✅(Enterprise Edition) | ❌ | Ingest Data into Redis |
Cassandra | ✅(Enterprise Edition) | ❌ | Ingest Data into Cassandra |
AWS DynamoDB | ✅(Enterprise Edition) | ❌ | Ingest Data into DynamoDB |
ClickHouse | ✅(Enterprise Edition) | ❌ | Ingest Data into ClickHouse |
InfluxDB | ✅(Enterprise Edition) | ❌ | Ingest Data into InfluxDB |
TimeScaleDB | ✅(Enterprise Edition) | ❌ | Ingest Data into TimescaleDB |
Oracle | ✅(Enterprise Edition) | ❌ | Ingest Data into Oracle |
操作性・観察性
Mosquittoは、ブローカーの状態を監視し、問題のトラブルシューティングを行うための基本的なロギングとデバッグ機能を備えています。しかし、高度な管理・監視機能がないため、実行中の状態を把握し、パフォーマンスを最適化することが困難です。
EMQXは、HTTP APIとDashboardを通じて、リッチでビジュアルな監視機能を提供し、監視と管理を容易にする。また、EMQXはPrometheusやDatadogとの連携をサポートしており、O&Mチームはサードパーティの監視プラットフォームを容易に利用することができます。
EMQX | Mosquitto | 参考リンク | |
---|---|---|---|
Dashboard | ✅ | ❌ | EMQXダッシュボード |
Configuration | HOCONフォーマット | Key-Value Fomat | |
HTTP API | ✅ | ❌ | EMQX REST API |
CLI | ✅ | ✅ | コマンドラインインターフェイス |
Config Hot update | ✅ | ❌ | コンフィギュレーションファイル |
Metrics | ✅ | ✅ | ノードのメトリクス: Metrics Mosquitto - $SYS topic |
Grafana | ✅ | ✅ | Prometheusとの連携 |
Cluster Metrics | ✅ | ❌ | メトリックス |
アラームアラート | ✅ | ❌ | システムトピック |
サブスクリプションの監視が遅い | ✅ | ❌ | 加入者数の統計が遅い |
Prometheus | ✅ | ✅ | Prometheusとの連携 |
クラウドネイティブとKubernetes
EMQXとMosquittoは、どちらもDockerベースのコンテナ型デプロイメントをサポートしています。EMQXはKubernetes OperatorやTerraformのサポートに優れており、パブリッククラウドプラットフォームへのデプロイや運用が容易になります。
また、EMQXは、世界中のAWS、Google Cloud、Microsoft Azureの17以上のリージョンで、Serverless、専用、BYOCのMQTTメッセージングサービスを提供しています。
EMQX | Mosquitto | 参考リンク | |
---|---|---|---|
Docker | ✅ | ✅ | EMQX Docker |
Kubernetes Operator | ✅ | ❌ | EMQX Kubernetes Operator |
Terraform | ✅ | ❌ | EMQX Terraform |
Cloud Service | ServerlessHosting/専用BYOC | Hosting |
EMQX Kubernetes Operator: https://github.com/emqx/emqx-operator
MosquittoからEMQXへのブリッジ接続
EMQXとMosquittoは全く異なるMQTTブローカーですが、MQTTブリッジングアプローチで完全に動作させることができます。
IoTエッジの組み込みハードウェアやゲートウェイにMosquittoを導入し、MQTTブリッジを介してクラウド上の大規模EMQXクラスタにIoTデータを集約・インジェストすることができます。
Mosquitto MQTTメッセージのEMQXへの橋渡し」を参照してください。
まとめ
上記の比較から、EMQXとMosquittoは、異なるニーズやユースケースに対応する人気のMQTTブローカーであることがわかります。
Mosquittoは、シングルスレッドで軽量なMQTT Brokerとして、IoTエッジのための組み込みハードウェア、産業用ゲートウェイ、小型サーバーへの導入に適しています。
EMQXは、高可用性と水平方向のスケーラビリティをサポートする、拡張性の高い分散型MQTTサーバーです。クラウド展開、大規模なIoT、IIoT、コネクテッドカーなどのアプリケーションにより適しています。
つまり、組み込みハードウェアやIoTエッジのデプロイメントにはMosquittoを選び、クラウドではEMQXを大規模スケーラブルで高可用性のMQTTメッセージングサービスとして利用することができます。
参考文献
- Eclipse Mosquitto
- Eclipse Mosquitto Documentation
- EMQX: The World's #1 Open Source Distributed MQTT Broker
- EMQX 5.0 Documentation
- EMQX Enterprise Documentation
- EMQX Operator Documentation
- MQTT over QUIC: Next-Generation IoT Standard Protocol