SSE(Server-Sent Events) 和 **MQTT(Message Queuing Telemetry Transport)**是两种不同的通信协议,分别适用于不同的应用场景。更详细地对比 SSE 和 MQTT,包括它们的工作原理、技术细节、性能特点、适用场景以及优缺点。
一、协议概述
1. SSE(Server-Sent Events)
- 定义:一种基于 HTTP 的服务器向客户端推送事件的协议。
- 标准:W3C 标准的一部分(HTML5 规范中定义)。
- 通信方向:单向(服务器 → 客户端)。
- 传输方式:使用持久化的 HTTP 连接,通过流式响应持续发送数据。
- 数据格式:纯文本,每条消息以
event:
, data:
, id:
等字段标识。
特点:
- 支持自动重连机制。
- 可以携带事件 ID,用于断线恢复。
- 基于浏览器内置 API(
EventSource
),无需额外库。
- 不支持跨域请求(除非服务端允许 CORS)。
2. MQTT(Message Queuing Telemetry Transport)
- 定义:一种轻量级的发布/订阅型消息协议,专为低带宽、高延迟或不可靠网络设计。
- 标准:ISO/IEC PRF 20922 标准。
- 通信方向:双向(客户端 ↔ Broker)。
- 传输方式:基于 TCP/IP 协议,默认端口 1883(非加密)、8883(TLS 加密)。
- 数据格式:二进制格式,高效紧凑。
特点:
- 支持三种服务质量等级(QoS 0, 1, 2)。
- 支持保留消息和遗嘱消息(LWT)。
- 使用主题(Topic)进行消息路由。
- 需要一个中间代理(Broker)来转发消息。
二、协议工作原理详解
1. SSE 工作流程
- 客户端(如浏览器)发起一个普通的 HTTP 请求到服务器,路径通常是
/stream
。
- 服务器响应并保持连接打开,返回
Content-Type: text/event-stream
。
- 服务器不断通过该连接发送数据块,格式如下:
event: message
data: {"temperature": 25}
id: 123456
retry: 3000
- 客户端监听这些事件,并在 JavaScript 中处理:
const source = new EventSource('/stream');
source.onmessage = function(event) {
console.log('收到:', event.data);
};
- 如果连接中断,客户端会自动尝试重新连接(可通过
retry
字段控制间隔)。
2. MQTT 工作流程
- 客户端连接到 MQTT Broker(例如 Mosquitto、EMQX、AWS IoT Core)。
- 客户端可以订阅某个主题(Topic),也可以发布消息到某个主题。
- 消息由 Broker 转发给所有订阅了该主题的客户端。
- 支持三种 QoS(服务质量)等级:
- QoS 0(最多一次):不保证送达,适用于传感器数据等可容忍丢失的场景。
- QoS 1(至少一次):确保消息送达,但可能重复。
- QoS 2(恰好一次):确保消息只送达一次,适合关键指令。
- MQTT 支持“遗嘱消息”(Last Will and Testament),当客户端异常断开时,Broker 会自动发布一条预设消息。
三、协议特性对比表
特性 |
SSE |
MQTT |
协议基础 |
HTTP |
TCP |
通信方向 |
单向(服务器→客户端) |
双向(客户端↔Broker) |
连接类型 |
长连接HTTP流 |
持久TCP连接 |
消息格式 |
UTF-8 文本 |
二进制 |
是否需要中间件 |
否(直接服务器输出) |
是(需要Broker) |
是否支持离线消息 |
否 |
是(取决于QoS级别) |
是否支持认证授权 |
依赖HTTP机制(Basic Auth、Token等) |
支持用户名密码、TLS证书等 |
是否支持多播/广播 |
否(每个客户端独立连接) |
是(通过主题订阅) |
是否支持压缩 |
依赖HTTP压缩机制 |
否(需应用层处理) |
是否支持断线重连 |
内建(自动) |
内建(需配置) |
是否支持消息优先级 |
否 |
否(需应用层实现) |
四、性能对比
维度 |
SSE |
MQTT |
带宽效率 |
较低(文本+HTTP头) |
高(二进制+无冗余头) |
延迟 |
中等(HTTP流) |
极低(TCP直连) |
并发能力 |
有限(每个客户端占用一个HTTP连接) |
高(轻量连接,支持上万设备) |
电池消耗 |
较高(长连接) |
低(支持休眠与心跳机制) |
部署复杂度 |
低(Web服务器即可) |
中等(需部署Broker) |
五、典型应用场景
✅ SSE 典型应用场景
- 实时新闻通知
- 股票行情更新
- 社交媒体动态流
- 简单的 Web 实时聊天
- 数据监控仪表盘
- 日志实时查看
✅ MQTT 典型应用场景
- 智能家居设备控制(灯光、温湿度传感器)
- 工业物联网(PLC、远程监测)
- 移动设备状态上报(如无人机、电动车)
- 智慧农业(土壤湿度、气象站)
- 医疗健康设备远程监控
- 智能电表、燃气表数据采集
六、开发语言 & SDK 支持
语言 |
SSE 支持 |
MQTT 支持 |
JavaScript (Web) |
✅ 原生支持(EventSource) |
✅ Paho-MQTT.js / MQTT.js |
Python |
✅ Flask + Response streaming |
✅ paho-mqtt |
Java |
✅ Spring WebFlux / Jersey |
✅ Eclipse Paho |
C/C++ |
❌ 通常用于服务器端 |
✅ Mosquitto C client |
Go |
✅ net/http + streaming |
✅ Eclipse Paho-Go |
Node.js |
✅ Express + Streaming |
✅ mqtt.js |
Android/iOS |
✅ 可用OkHttp/Retrofit模拟 |
✅ 有原生SDK |
七、如何选择?
场景 |
推荐协议 |
Web 应用需要实时推送数据 |
SSE |
多个设备之间需要互相通信 |
MQTT |
需要低功耗、低带宽通信 |
MQTT |
需要双向通信(如设备控制) |
MQTT |
快速开发、不需要部署额外组件 |
SSE |
大规模物联网系统 |
MQTT |
需要消息可靠性(如支付确认) |
MQTT(QoS=2) |
实时日志展示 |
SSE |
设备在线状态管理 |
MQTT(LWT机制) |
八、补充说明
📌 关于 WebSocket?
WebSocket 是另一个常见的实时通信协议,它与 SSE 和 MQTT 的区别在于:
协议 |
通信方向 |
协议基础 |
是否全双工 |
适用场景 |
WebSocket |
双向 |
TCP |
✅ |
Web 实时通信(如聊天、游戏) |
SSE |
单向 |
HTTP |
❌ |
Web 推送通知 |
MQTT |
双向 |
TCP |
✅ |
物联网通信 |