guide · mqtt
MQTT 与 HTTP:如何选择
从连接模型、可达性、投递语义、运维和生态角度比较 MQTT 与 HTTP。
版本、来源核对与技术审阅
- 适用场景
- MQTT:协议、架构与生产实践
- 发布日期
- 版本
- 版本信息见一手来源
- 事实与来源
- 已于 2026年7月14日 对照所引来源核对
- 技术审查
- 暂无独立技术审阅记录
结论先行
一句话决策建议
HTTP 适用于请求导向的、广泛互操作的交换;MQTT 适用于长生命周期的、代理式的多对多消息传递和间歇连接设备。
直接回答
当一方在有限请求和即时响应场景中寻址另一方时使用 HTTP,尤其是在 Web 基础设施和第三方互操作性占主导的场景。当间歇连接的设备需要长生命周期、代理式、双向消息传递以及订阅和会话状态时使用 MQTT。生产 IoT 系统通常两者并用:设备与消息平面之间使用 MQTT,配置、管理、批量传输和公共 API 使用 HTTP。
范围与边界
本比较关注通信形态和运维模型。它不声称任一协议是设备管理平台。HTTP 可以做流式传输,MQTT 可以实现请求/响应,但例外模式需要有具体理由。比较正常的失败行为,而非仅看演示能否发送字节。
决策准则
从可达性开始。处于运营商 NAT 后面的设备可以发起出站 HTTP 请求或 MQTT 连接,但服务器通常无法向其发起 HTTP 请求。MQTT 保持一条出站连接,代理通过该连接路由命令。轮询以请求开销、延迟和同步负载为代价近似实现这一能力;长轮询和 WebSocket 改变了架构,应单独评估。
考虑交互形态。HTTP 天然映射到资源操作、上传、下载和带即时状态的事务。MQTT 天然映射到异步遥测、事件、期望状态和扇出。代理订阅将生产者与消费者地址解耦,而 HTTP 通常需要一个端点或其后面的队列。
投递语义不同。HTTP 确认的是与服务器的交换,而非下游结果。MQTT QoS 确认的是代理协议步骤,同样不是物理结果。两者都需要幂等性和应用确认来处理有后果的命令。MQTT 额外提供持久会话、保留消息和离线队列,但仅在设计了过期和限制时才有用。
用真实行为衡量网络成本。MQTT 的紧凑报头在连接建立后对频繁小消息有帮助。TLS 握手、保活、主题长度、QoS 确认、重连、HTTP 头部、压缩和蜂窝计费增量都可能主导理论差异。对于不频繁的日报,维持连接可能价值不大。
运维很重要。HTTP 受益于成熟的代理、身份系统、链路追踪、缓存和熟悉度。MQTT 引入了代理容量、连接准入、主题 ACL、会话持久化和队列恢复。这些既是有用的能力,也是额外的责任。
架构流程
- 列出每个流:配置、遥测、事件、命令、确认、固件、配置查询。
- 记录方向、频率、负载、延迟、离线预期、扇出和失败后果。
- 按流选择 HTTP 或 MQTT,而非为整个产品声明一种协议。
- 在两个平面上定义统一的身份和授权模型。
- 保持模式足够独立,使其能穿过网关而不丢失标识符、时间戳或过期信息。
- 测试断连、重试、重复投递、过期命令和服务降级。
- 观察端到端结果,而非将 2xx 响应或 PUBACK 视为完成。
失败模式
频繁轮询可能在中断后造成惊群效应。无限制的 MQTT 离线队列可能在恢复后投递过期任务。将保留消息用作事件历史会重放错误的语义。将每个操作都做成同步 HTTP 会将可用性耦合到长依赖链上。将每个管理查询都变成 MQTT 请求/响应可能使授权、调试和超时比传统 API 更困难。双协议设计在每条路径各自发明不同的身份或模式时会发生漂移。
实施清单
- 每个流都有方向、频率、延迟和离线要求。
- 协议选择按流进行并有明确理由。
- 命令使用幂等性、过期、确认和结果状态。
- HTTP 重试和 MQTT 重投不会重复不安全的副作用。
- 身份和租户边界在两个平面上一致。
- 重连和轮询行为在共享中断后经过负载测试。
- 指标区分传输成功与业务完成。
- 批量负载和固件使用经过刻意选择的传输路径。
评审证据
保留一份流清单和时序图,显示每方谁发起交换、离线时发生什么、以及成功在哪里变为持久。为代表性小消息、大消息和重连场景捕获网络抓包,而非孤立引用协议开销。记录实际库的重试和过期默认值。评审时,询问新网桥是在翻译语义还是仅改变传输:标识符、授权上下文、新鲜度和结果确认必须穿越边界。当消息频率、可达性、蜂窝定价或第三方集成发生变化时重新评审选择;协议决策是工作负载决策,而非永久的品牌偏好。
边界评审
当同时使用两种协议时,定义翻译发生在哪里以及哪一层负责重试。网桥不能仅因为已发布 MQTT 就将 HTTP 请求确认完成,也不能因为 HTTP 服务器接受了请求就确认 MQTT 工作。在边界上保留一个应用标识符并记录每个最终结果。
单独审查凭据范围。用于 MQTT 的设备证书不应自动授权管理 HTTP API,API 令牌也不应成为通配的 MQTT 主体。在保持每流最小权限的同时应用一致的租户和设备身份。测试跨交接点的可观测性,使运维人员能跟踪一个请求而无需记录密钥或完整负载。
最后,文档化降级模式。确定配置失败是否阻塞遥测、命令投递在 API 中断期间是否继续、以及批量下载如何避免饿死消息传递。明确的边界使混合设计具有韧性;未文档化的耦合只是将两种协议隐藏在一个中断背后。
主要参考来源
OASIS MQTT 5.0 规范定义了会话、QoS、订阅、保留消息和过期。IETF HTTP 语义规范 RFC 9110定义了方法、状态语义、中间代理和重试考量。在目标网络中验证 SDK 和基础设施行为。
上线前必读
实施检查清单
- 按交互而非按产品选择协议。
- 在需要时将配置 API 与遥测分离。
- 测试代理、NAT 和离线行为。
一手来源
事实核验
- OASIS MQTT Version 5.0访问日期 2026年7月14日
来源核对日期 2026年7月14日 · 下次计划核对: 2027年7月14日
维护记录
更新历史
- 2026年7月14日
- 首次发布
- 2026年7月14日
- 更新内容并核对来源
如有不清晰、不准确或过时的内容,请告诉我们。