协议对比

MQTT 与 WebSocket:消息协议还是通信通道?

MQTT 定义了发布/订阅主题、QoS、会话、保留状态和 Broker 行为。WebSocket 创建了一个持久的全双工通道。它们在简单的实时应用中可能相互竞争,但 MQTT 也可以运行在 WebSocket 之上。

分离传输层与消息语义

WebSocket 解决了字节如何在持久连接上传输的问题。MQTT 也定义了消息系统如何处理这些字节。

MQTT

一种带有 Broker 路由、主题、消息级别、保留消息、会话状态和设备友好客户端的应用消息协议。

最适合多对多的物联网事件、遥测、状态和命令。

WebSocket

客户端和服务器之间持久的双向传输通道。消息的含义、路由、授权、重放和确认属于应用层定义。

最适用于自定义的浏览器到服务器实时体验。

能力
能力MQTTWebSocket
主要角色应用消息协议持久全双工通信通道
拓扑结构由 Broker 协调的多个发布者和订阅者一个客户端连接到一个服务器端点
路由机制内置的层级主题和通配符订阅应用定义的事件、房间、通道或处理器
消息投递行为QoS 0、1 和 2,外加保留消息和会话队列连接上的有序帧;应用层负责确认和恢复
浏览器支持在浏览器中使用 MQTT over WebSocket基于 ws 或 wss 的原生浏览器 API
访问控制客户端身份、发布和订阅主题策略应用会话和自定义消息授权

选择最小的完整模型

当产品真正需要主题、扇出(fan-out)、离线行为和设备身份时,应避免在 WebSocket 处理器内部重建 Broker 语义。

选择 MQTT

当设备和服务通过主题交换遥测、状态和命令,并需要定义好的投递和会话行为时。

选择 WebSocket

当浏览器和应用服务器需要自定义的实时通道,且产品不需要通用的 Broker 语义时。

使用 MQTT over WebSocket

当浏览器客户端应与设备使用相同的主题和策略模型时,通常通过 443 端口的安全 WSS 实现。

实践中的 MQTT over WebSocket

浏览器使用 WebSocket 作为传输层,而 MQTT 仍然是应用协议和 Broker 契约。

暴露 WSS 端点

使用受信任的 TLS 证书、文档化的路径和支持长期连接的代理超时设置。

收紧浏览器身份权限

应使用短期或限定范围的 Broker 凭据,而非在前端代码中嵌入共享的设备密钥。

重用主题策略

通过与其他客户端相同的明确主题契约,授权浏览器执行发布/订阅操作。

MQTT 与 WebSocket 常见问题解答

MQTT 和 WebSocket 是同一种协议吗?

不是。MQTT 定义了应用层消息语义。WebSocket 提供了一个持久的双向通道。MQTT 可以使用 WebSocket 作为其传输层之一。

浏览器可以直接连接到 MQTT 吗?

浏览器无法打开任意的原始 TCP 套接字,因此浏览器 MQTT 客户端通常需要通过 Broker 的 WebSocket 或安全 WebSocket 监听器连接。

WebSocket 比 MQTT 快吗?

直接帧的协议开销可能更小,但有用的系统还必须实现路由、投递、恢复和授权。应衡量完整的应用路径,而不仅仅是帧开销。