直接回答

当一方在有限请求和即时响应场景中寻址另一方时使用 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、会话持久化和队列恢复。这些既是有用的能力,也是额外的责任。

架构流程

  1. 列出每个流:配置、遥测、事件、命令、确认、固件、配置查询。
  2. 记录方向、频率、负载、延迟、离线预期、扇出和失败后果。
  3. 按流选择 HTTP 或 MQTT,而非为整个产品声明一种协议。
  4. 在两个平面上定义统一的身份和授权模型。
  5. 保持模式足够独立,使其能穿过网关而不丢失标识符、时间戳或过期信息。
  6. 测试断连、重试、重复投递、过期命令和服务降级。
  7. 观察端到端结果,而非将 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 和基础设施行为。