EMQX vs Mosquitto | 2023 MQTT Broker 对比
目录
引言
物联网开发者需要为自己的物联网项目选择合适的 MQTT 消息产品或服务,从而构建可靠高效的基础数据层,保障上层物联网业务。目前市面上有很多开源的 MQTT 产品,在性能功能等方面各有优点。本文将选取目前最为流行的两个开源 MQTT Broker:EMQX 和 Mosquitto,从技术架构、性能、功能、社区情况等多维度进行 1v1 对比,帮助读者更加深入了解这两个产品。
Mosquitto 简介
Mosquitto 项目最初由 Roger Light 于 2009 年开发,后来捐赠给了 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 上最活跃、Star 数最高的 MQTT Broker 项目,在过去 12 个月里有 11.4K 个 Star 和超过 3000 个 Commit。
Mosquitto 以其轻量级的单线程架构在部署上比 EMQX 更普遍,特别是在资源有限的嵌入式设备上。
EMQX | Mosquitto | |
---|---|---|
GitHub Project | EMQX GitHub | Mosquitto GitHub |
Project Created | 2013 | 2009 |
License | Apache License 2.0 | EPL/EDL License |
GitHub Stars | 11.4k | 7.2 k |
GitHub Forks | 2k | 2.1k |
GitHub Commits | 14k+ | 2.8k+ |
GitHub Commits (Last 12 Months) | 3000+ | 500+ (Eclipse Mosquitto™ ) |
GitHub Issues | 3500+ | 2200+ |
GitHub Releases | 260+ | 60+ |
GitHub PRs | 6000+ | 600 |
GitHub Contributors | 100+ | 110+ |
性能与可扩展性
Mosquitto 作为一个轻量级 MQTT 消息中间件有着比较优秀的单节点性能,单机可以支撑 10w 级别的设备并发连接。但不支持集群架构。
EMQX 作为可集群部署的大规模消息服务器,单节点可以支持百万级并发连接,单集群支持亿级并发连接。但 CPU 和内存使用率更高。
EMQX | Mosquitto | Notes & Links | |
---|---|---|---|
Scalability | - 4M MQTT connections per node - 100M MQTT connections per cluster |
<100K MQTT connections per node | Reaching 100M MQTT connections with EMQX 5.0 |
Performance | - 2 million QoS0 MQTT msgs/sec per node - 800k QoS1 msgs/sec - 200k QoS2 msgs/sec |
- Up to 120k QoS0 MQTT msgs/sec per node - 80k QoS1 msgs/sec - 60k QoS2 msgs/sec |
|
Latency | Single-digit millisecond latency at scale | Up to seconds latency in some scenarios | |
Clustering | 20+ nodes of cluster | ❌ | Cluster Scalability |
Elastic and Resilient scaling at runtime | ✅ | ❌ | |
Auto Clustering | ✅ | ❌ | EMQX Node Discovery and Autocluster |
Zero Downtime/Hot Upgrade | ✅ | ❌ | Release Upgrade |
协议支持
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 以及其他协议扩展。
EMQX | Mosquitto | Notes and Links | |
---|---|---|---|
MQTT 3.1/3.1.1 | ✅ | ✅ | The Easy-to-understand Guide to MQTT Protocol |
MQTT 5.0 | ✅ | ✅ | MQTT 5 Explore |
MQTT Shared Subscription | ✅ | ✅ | |
MQTT Add-ons | - Exclusive subscription - Delayed Publish - Auto-subscription - Topic rewrite |
❌ | |
MQTT over TCP | ✅ | ✅ | EMQX Getting Started |
MQTT over TLS | ✅ | ✅ | Enable SSL/TLS for EMQX MQTT broker |
MQTT over WebSocket | ✅ | ✅ | Connect to MQTT broker with Websocket |
MQTT over QUIC | ✅ | ❌ | EMQX is now the only MQTT broker in the world that supports QUIC transport. (MQTT over QUIC) |
LB (Proxy Protocol) | ✅ | ✅ | Proxy Protocol v1, v2 (Cluster load balancing) |
IPv6 Support | ✅ | ✅ | |
Multi-protocol Gateway | ✅ | ❌ | Extended protocol gateway |
MQTT-SN | ✅ | ❌ | MQTT-SN Gateway |
CoAP | ✅ | ❌ | CoAP Protocol Gateway |
LwM2M | ✅ | ❌ | LwM2M Protocol Gateway |
STOMP | ✅ | ❌ | Stomp Gateway |
安全性
安全性对于物联网设备连接以及设备之间、设备与云服务之间的数据交换至关重要。Mosquitto 和 EMQX 都支持基于 TLS/SSL 的安全连接。此外,EMQX 还支持 QUIC 传输、OCSP Stapling、Audit Logs 和 Black Duck 源代码扫描。
EMQX | Mosquitto | Notes and Links | |
---|---|---|---|
TLS/SSL | ✅ | ✅ | EMQX: TLS 1.1, 1.2, 1.3 (Enable SSL/TLS for EMQX MQTT broker) |
QUIC | ✅ | ❌ | MQTT over QUIC: Next-Generation IoT Standard Protocol |
OCSP Stapling | ✅ | ✅ | EMQX Supports OCSP stapling |
Audit Logs | ✅ | ❌ |
认证与鉴权
在客户端认证权限与访问控制方面,Mosiquitto 提供了动态安全插件,通过灵活的方式处理用户名/密码身份验证和访问控制。Mosiquitto 支持匿名与用户名密码方式认证,并可以通过动态安全插件提供的自定义组群和角色的方式控制消息主题的访问权限。
EMQX 支持多种认证机制,如用户名密码认证、JWT 认证以及基于 MQTT 5.0 协议的增强认证。EMQX 支持与多种数据存储方式集成,包括内置数据库、文件、MySQL、PostgreSQL、MongoDB 和 Redis。
此外,EMQX 为用户提供了黑名单功能,用户可以通过 Dashboard 和 HTTP API 将指定客户端加入黑名单以拒绝该客户端访问,除了客户端标识符以外,还支持直接封禁用户名甚至 IP 地址,方便用户灵活管理客户端的连接与访问。
EMQX | Mosquitto | Notes & Links | |
---|---|---|---|
Username/Password | ✅ | ✅ | EMQX: AuthN Introduction Mosquitto: Authentication methods |
JWT | ✅ | ✅ | EMQX:JWT Authenticaton Mosquitto: Auth plugin for mosquitto |
MQTT 5.0 Enhanced Authentication | ✅ | ❌ | SCRAM Authentication |
PSK | ✅ | ✅ | SSL/TLS |
X.509 Certificates | ✅ | ✅ | |
LDAP | ✅ | ✅ | LDAP Authentication/ACL |
Fine-grained Access Control | ✅ | ✅ | EMQX Authorization |
Authentication Backends | ✅ | ✅ | Authentication Introduction |
ACL Database Backends | ✅ | ✅ | EMQX:Files, MySQL, PostgreSQL, MongoDB, Built-in Database, HTTP EMQX Authorization Introduction |
Flapping Detect | ✅ | ❌ | |
Block List | ✅ | ❌ |
数据集成
Mosquitto 默认通过 MQTT 客户端消息订阅方式实现外部系统对数据的消费。此外,Mosquitto 提供了多个 Mosquitto 之间的数据桥接能力,可以用于多个 broker 之间的分布式部署与数据打通。
EMQX 在数据集成方面提供了 WebHook 方式将客户端消息和事件推送到外部系统中。EMQX 也同样提供了类似于 Mosquitto 的 MQTT 数据桥接功能,可以连接多个 EMQX 集群或其他标准 MQTT 服务。EMQX 在企业版中重点增强了数据集成能力。EMQX 企业版可以通过规则引擎对接各类主流型数据库、消息队列以及云服务,在数据可靠性与架构设计灵活性上大大增强。
EMQX | Mosquitto | Notes and Links | |
---|---|---|---|
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 |
规则引擎
为了用户更加方便地实现高性能数据预处理与基于业务需求的数据路由,EMQX 内置了基于 SQL 的规则引擎组件,搭配数据桥接使用,无需编写代码即可实现一站式的 IoT 数据提取、过滤、转换、存储与处理,以加速应用集成和业务创新。
EMQX | Mosquitto | Notes and Links | |
---|---|---|---|
Rule Engine | ✅ | ❌ | Rule Engine |
Built-in Functions | ✅ | ❌ | Built-in SQL Functions |
JQ Functions | ✅ | ❌ | JQ functions |
Event Trigger | ✅ | ❌ | Rule Engine |
JSON Codec | ✅ | ❌ | |
Avro Codec | ✅(Enterprise Edition) | ❌ | Custom codec example - Avro |
ProtoBuf Codec | ✅(Enterprise Edition) | ❌ | Custom codec example - Protobuf |
Schema Registry | ✅ (Enterprise Edition) | ❌ | Introduction to Schema Registry |
可操作性与可观测性
Mosquitto 提供了基本的日志和调试功能,用于监控代理状态和故障排除。然而,它缺乏先进的管理和监控功能,使用户难以从其运行状态获得更多洞察进行性能优化。
EMQX 通过 HTTP API 和 Dashboard 提供丰富和可视化的监控功能,使其更容易监控和管理。此外,EMQX 支持与 Prometheus 和 Datadog 的集成,使运维团队能够轻松使用第三方监控平台。
EMQX | Mosquitto | Notes and Links | |
---|---|---|---|
Dashboard | ✅ | ❌ | EMQX Dashboard |
Configuration | HOCON Format | Key-Value Fomat | |
HTTP API | ✅ | ❌ | EMQX REST API |
CLI | ✅ | ✅ | Command Line Interface |
Config Hot update | ✅ | ❌ | Configuration Files |
Metrics | ✅ | ✅ | Node metrics: Metrics Mosquitto - $SYS topic |
Grafana | ✅ | ✅ | Integrate with Prometheus |
Cluster Metrics | ✅ | ❌ | Metrics |
Alarm Alerts | ✅ | ❌ | System Topic |
Slow Subscription Monitoring | ✅ | ❌ | Slow subscribers statistics |
Prometheus | ✅ | ✅ | Integrate with Prometheus |
云原生部署与 K8s 支持
Mosquitto 支持基于 docker 的容器化部署。EMQX 在此基础上提供了基于 Kubernetes Operator 和 Terraform 云原生自动部署能力,更加方便在容器环境下的部署与运维。
EMQX | Mosquitto | Notes and Links | |
---|---|---|---|
Docker | ✅ | ✅ | EMQX Docker |
Kubernetes Operator | ✅ | ❌ | EMQX Kubernetes Operator |
Terraform | ✅ | ❌ | EMQX Terraform |
Cloud Service | - Serverless - Hosting/Dedicated - BYOC |
Hosting |
EMQX Kubernetes Operator: https://github.com/emqx/emqx-operator
桥接 Mosquitto 到 EMQX
虽然 EMQX 和 Mosquitto 作为 MQTT Broker 有着很多不同之处,但它们可以通过 MQTT 桥接的方式实现完美结合。
我们可以在物联网边缘的嵌入式硬件或网关上部署 Mosquitto,实现小规模边缘数据接入,然后通过桥接方式与云端的 EMQX 集成,实现大规模的云端数据汇聚接入。
结语
通过以上对比,我们可以看出:Mosquitto 作为单节点的轻量级 MQTT 消息中间件,更加适合部署在工业网关、工控机、小型服务器中,实现中小规模的 MQTT 设备连接场景下快速高效的数据接入与消息路由。而 EMQX 作为支持高可用集群的大规模 MQTT 消息服务器,更适合部署在数据中心、公有云或私有云环境,为较大规模数据接入以及对高可用有需求的用户提供服务。
您可以选择 Mosquitto 用于嵌入式硬件和 IoT 边缘部署,并使用 EMQX 作为云中高度可扩展、高可用的 MQTT 消息服务。
此外,对于有更大规模设备连接与大吞吐数据接入需求,且对数据完整性、数据持久化以及数据集成灵活性有较高要求的用户,我们建议您使用 EMQX 企业版本。