核心结论速览
一句话总结:WebSocket 是一条通用、全双工的实时通信'高速公路'——它为你打通双向通道,但路上跑什么车、怎么调度,全靠你自己设计。MQTT 是一个内置邮局系统的轻量级消息协议——它不仅提供通道,还自带主题路由、服务质量(QoS)、离线缓存、遗嘱通知等完整消息基础设施。
二者并非互斥,而是互补共生。在现代高并发、多端协同、跨设备的即时通讯系统中,常采用 'MQTT 做后端消息总线 + WebSocket 做前端接入' 的混合架构,以兼顾灵活性、可靠性与可扩展性。
一、协议原理与系统架构对比
1. 协议层级与定位
| 维度 | WebSocket | MQTT |
|---|---|---|
| OSI 层级 | 应用层(RFC 6455),但功能上更接近增强型传输层 | 标准应用层协议(OASIS 标准) |
| 本质 | 通信通道(Transport Channel) | 消息协议(Messaging Protocol) |
| 设计目标 | 打破 HTTP 请求 - 响应模型,为 Web 提供类 Socket 的双向能力 | 为低带宽、高延迟、不可靠网络下的设备间通信提供可靠、轻量的消息分发机制 |
关键洞察:WebSocket 关注'如何传',MQTT 关注'传什么、给谁、是否成功'。
2. 系统架构模型
WebSocket:客户端 - 服务器(Client-Server)
- 连接建立后形成点对点双向通道。
- 无内置广播、路由或主题机制。
- 若需群聊或消息广播,必须由应用层维护用户 - 连接映射表,并通过 Redis Pub/Sub 或 Kafka 等中间件实现跨节点消息同步。
- 状态耦合强:服务端需精确知道每个用户的连接在哪台机器上。
MQTT:发布/订阅(Pub/Sub) + Broker 中心
- 三元角色:
- Publisher(发布者):发送消息到某个 Topic。
- Subscriber(订阅者):监听特定 Topic。
- Broker(代理):负责消息路由、会话管理、QoS 处理。
- 天然解耦:发布者不知道订阅者是否存在,反之亦然。
- 状态集中管理:Broker 维护所有会话、订阅关系和离线队列(若启用持久会话)。
架构优势:MQTT 的 Pub/Sub 模型天然适合 IM 中的'一对一私聊'、'一对多群聊'、'系统通知广播'等场景。
二、工作流程详解
WebSocket 工作流程(IM 场景)
用户 A (Web) -> WS 服务器 -> 用户状态/消息库
HTTP GET /chat + Upgrade: websocket
101 Switching Protocols
WebSocket 连接建立
{to: "userB", msg: "Hello"}
查询 userB 的在线状态 & 连接位置
转发消息
存储离线消息
alt [userB 在线] [userB 离线]


