Azure IoT Hub 和 EMQX 是实现大规模设备连接和可靠 IoT 数据传输的两大主流平台。二者均已在生产环境中得到广泛验证,但由于其底层架构截然不同,直接决定了它们的性能、功能以及长期成本构成。
本文将深入对比 Azure IoT Hub 与 EMQX 在架构设计、协议支持、消息路由、扩展性、存储、设备状态、文件传输、安全性及运营限制等方面的差异,帮助架构师与技术决策者理解两个平台的适用场景、核心区别以及大规模部署时可能面临的技术选型问题。
在 IoT 系统设计中,架构决定了吞吐量上限和协议灵活性。Azure IoT Hub 和 EMQX 采用了两种完全不同的架构。
Azure IoT Hub 基于 Azure Event Hubs 构建,采用分区日志架构。传入的遥测数据被写入固定的分区,每个分区在单个消费者组内同一时间只能由一个消费者实例读取。这种设计既带来了稳定的吞吐量,也导致了结构性的读取瓶颈,这一问题在下游系统需要高并发处理能力时尤为明显。此外,其日志储存周期较短,主要为对接 Azure 后端服务而优化。
EMQX 基于 Erlang/OTP Actor 模型构建。每个连接都由一个轻量级进程处理,赋予了 EMQX 极高的并发处理能力和极低的响应延迟。EMQX Enterprise 6.0 进一步引入了基于 RocksDB 的存储引擎,支持在同一集群内实现持久化和异步消息传输。
| 特性 | Azure IoT Hub | EMQX Enterprise / Cloud |
|---|---|---|
| 核心模式 | 用于数据摄取与转储的云网关。 | 集发布/订阅与持久化队列于一体的统一消息中间件。 |
| 并发模型 | 连接速率受限(S1:每秒大约 12 次)。 | 受硬件限制,测试支持 1 亿并发连接。 |
| 扩展方式 | 通过预定义规格的容量单元(S1、S2、S3)水平扩展,吞吐量、连接数和存储绑定扩展,容易产生资源浪费。 | 支持细粒度的水平集群扩展。可根据部署模式,独立扩展会话连接、吞吐能力或存储容量。 |
| 数据路径 | 分区日志架构,消费者并发数受分区数量限制。 | 分布式网状路由,无分区数量限制。 |
| 持久化 | 短期日志存储(1 至 7 天)。 | 双引擎(内存 + RocksDB 持久化存储)。 |
| 多租户 | 每个 IoT Hub 实例对应一个租户。 | 单集群内支持基于命名空间的多租户隔离。 |
Azure IoT Hub 仅将 MQTT 3.1.1 作为兼容层使用,并非功能完整的 Broker,缺失了许多关键的 MQTT 特性。相比之下,EMQX 原生支持 MQTT 3.1、3.1.1 和 5.0,以及 CoAP、LwM2M 及 MQTT-SN 等协议。
| 特性 | Azure IoT Hub | EMQX Enterprise / Cloud | 技术影响 |
|---|---|---|---|
| MQTT 版本 | 部分支持 3.1.1 | 完整支持 3.1, 3.1.1, 5.0 | Azure 无法使用 MQTT 5 的功能,如主题别名、流控制。 |
| 主题结构 | 固定且以设备为中心 | 完全自定义的层级结构 | EMQX 支持更复杂的工业及多租户场景 |
| QoS 2 | 不支持 | 支持 | 事务性或高完整性 IoT 负载的刚需 |
| 保留消息 | 忽略 | 完整支持且可持久化 | Azure 用户依赖外部数据库查询「最后已知状态」 |
| 共享订阅 | 不支持 | 支持 | 启用工作池和水平负载均衡 |
| MQTT over QUIC | 不支持 | 原生支持 | 提升不稳定网络和移动网络下的连接性能 |
| CoAP、LwM2M、MQTT-SN 等 | 需要外部网关转换 | 原生网关支持 | 资源受限设备可以直接连接 EMQX |
| 心跳间隔 | 最长 1,767 秒 | 最长 65,535 秒 | 更长的间隔有助于降低蜂窝设备的电池消耗 |
Azure IoT Hub 提供基于消息头和内容的简单 SQL 过滤,但不支持消息转换、丰富或动态重塑。复杂逻辑需要依赖 Azure Functions 或 Stream Analytics 实现。
EMQX 内置功能强大的 SQL 规则引擎,提供解码、编码、JSON 重塑、正则匹配、数学运算及调用外部 API 等原生函数。此外,EMQX 6.0 还新增了可视化流设计器,无需编码即可构建数据处理管道。
Azure IoT Hub 提供有限的云到设备(C2D)队列,并依赖 Event Hubs 实现设备到云(D2C)的缓冲。
EMQX 6.0 直接在 Broker 内部集成了持久化队列,支持:
这在中小规模架构中,可以有效替代对 Kafka 等外部消息队列的依赖。
Azure 采用「容量单位」计费,连接速率限制非常严格:
| 单元 | 每日消息上限 | 预计连接速率 |
|---|---|---|
| S1 | 40 万条 | 每秒大约 12 次 |
| S2 | 600 万条 | 每秒大约 120 次 |
| S3 | 3 亿条 | 每秒大约 6000 次 |
由于资源维度是捆绑的,用户往往为了满足连接速率而被迫购买昂贵的超额消息容量。此外,分区数在创建时即固定,限制了后端消费者的并发上限。
得益于 Erlang Actor 模型,EMQX 支持极高的连接密度。在测试中,单个 23 节点的 EMQX 5 集群支持了 1 亿并发 MQTT 连接。EMQX 的性能主要受限于硬件,没有固定的每日消息上限,添加计算资源即可实现线性扩展。
Azure 提供设备孪生功能,通过托管的 JSON 文档同步所需的预期属性和报告属性,与 Azure 服务无缝集成,并提供查询支持。
EMQX 则使用保留消息和最后值队列来维护设备状态,支持即时读取最新值。但 EMQX 并未内置期望值与报告值的同步功能,对该功能有需求的应用程序通常会在后端逻辑中实现。
Azure IoT Hub 通过 SAS URL 实现文件上传,设备需要支持 HTTPS、处理 Token 轮换,并直接上传至 Blob 存储。
EMQX 支持基于 MQTT 连接的文件传输,避免了设备端多协议栈的复杂性,并支持断点续传和带宽限速。
Azure 为远程访问提供安全的双向 TCP 隧道,但该功能仍处于预览状态。
EMQX 虽然没有专门的远程访问产品,但可以通过二进制负载和主题路由灵活构建自定义隧道方案。
Azure 与 Microsoft Entra ID 集成,支持 X.509、SAS Token 和 TPM 认证。
EMQX 支持内部数据库、JWT、LDAP 及外部 REST 服务认证,并拥有细粒度的的主题级 ACL 控制。
Azure IoT Hub 以每个实例为单一租户。SaaS 提供商通常需要为每个客户部署独立的 Hub。
EMQX 6.0 支持基于命名空间的多租户,允许不同业务部门在同一集群内共享资源,同时保持数据和权限的逻辑隔离。
Azure IoT Hub 的定价模式以单元和消息计量为基础,消息以 4KB 为单位计费,通常会增加小型部署场景的成本。此外,用户必须按峰值负载预置资源,且无法缩容至零。
EMQX 的定价模式灵活多样,可根据部署模型进行选择:
随着消息速率增加,成本差距会进一步拉大。这是因为 Azure 用户必须升级整个单元,而 EMQX 的成本主要与带宽成正比。
| 指标 | Azure IoT Hub S1 | Azure IoT Hub S3 | EMQX 专有版 | EMQX Enterprise |
|---|---|---|---|---|
| 最大连接数 | 1,000,000 | 1,000,000 | 按配置扩展 | 测试至 1 亿 |
| 吞吐量 | 每秒 100 条或 12 连接 | 每秒约 6,000 条 | 每次部署约 10,000 条 | 受硬件限制 |
| 最大消息大小 | 64 KB C2D, 256 KB D2C | 同左 | 默认 1 MB,可选 10 MB | 256 MB |
| 文件上传速率 | 1.67 次/秒/单元 | 83.33 次/秒/单元 | 计入消息速率 | 受硬件限制 |
| 保留状态大小 | 40 KB | 40 KB | 1 MB | 256 MB |
注:本文内容基于 2025 年 12 月的产品特性及定价信息。鉴于两个平台的技术迭代迅速,建议在决策前参考各官网的最新文档。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69958136/viewspace-3109793/ ,如需转载,请注明出处,否则将追究法律责任。