Appearance
什么是 SSE(Server-Sent Events)?
SSE 是一个服务端单向推送协议,基于 HTTP 长连接,服务端可以主动将事件推送至客户端,实现流式数据传输。
SSE 工作原理
客户端发起一个带有特殊请求头的 HTTP 请求,要求服务端使用 SSE 协议。
服务端返回对应请求头,并以 SSE 数据流格式持续发送消息,连接不关闭。
- 消息格式:每条消息以
data:开头,\n\n结尾
- 消息格式:每条消息以
客户端使用 EventSource 接口持续接收消息。
为什么需要 SSE
传统 HTTP 请求-响应模型无法满足大模型流式输出需求,轮询/长轮询资源消耗大且延迟高。
SSE 可以在一个长连接中多次持续发送大模型响应,实现流式输出效果,提升用户体验。
为什么不用 WebSocket
WebSocket 支持全双工且可以定制会话状态管理,但实现复杂、资源占用大。
大模型应用只需要服务端单向流式输出,所以轻量的 SSE 更合适。
- 如果需要支持用户在输入过程中打断生成(如语音对话),可考虑 WebSocket。
SSE 和 WebSocket 的区别
| 特性 | SSE | WebSocket |
|---|---|---|
| 通信方向 | 单向 | 全双工 |
| 协议基础 | HTTP 长连接 | WS 协议,通过 HTTP 升级 |
| 实现复杂度 | 简单、轻量、高效 | 复杂,需要手动管理状态 |
| 兼容性 | 完全兼容 HTTP | 不完全兼容 HTTP |
| 适用场景 | 流式文本生成、进度通知、日志推送 | 聊天对话、在线游戏、在线协作编辑 |
SSE 在大模型应用中的优势
流式输出,提升用户体验
- 逐 Token 推送,降低延迟,减少用户等待时间
实现简单,开箱即用
- 浏览器原生支持
性能优秀,扩展性强
可复用 HTTP 基础设施,无需维护复杂连接状态
支持 HTTP/2 多路复用,高并发下优于 WebSocket
SSE 如何保证消息完整性
消息通过
id:字段标识序号断线重连时,客户端使用
Last-Event-ID请求丢失数据
举例子类比记忆
SSE 类似广播电台:服务端持续播放消息,客户端只能接收,不需反馈。
WebSocket 类似双向电话:双方可以同时说话和听,管理复杂。
知识点易错提醒
SSE 并不是完全替代 WebSocket,它只适合单向流式输出场景。
忽略断线重连机制容易导致数据丢失。
延伸面试提问及应答建议
SSE 在高并发场景下的优势和劣势是什么?
- 示例答句:SSE 可复用 HTTP 基础设施,支持 HTTP/2 多路复用,高并发下资源消耗低,但仅支持单向通信,不适合需要客户端频繁发送数据的场景。
当大模型生成被中断时,如何保证消息完整性?
- 示例答句:通过消息
id字段标识序号,客户端断线重连时使用Last-Event-ID请求丢失数据,保证完整性。
- 示例答句:通过消息
为什么流式输出比轮询效率更高?
- 示例答句:轮询需要不断建立请求,增加延迟和资源消耗;流式输出在单一长连接中持续发送数据,延迟低、资源占用少。
豆包语言通话用什么协议?
豆包语言通话使用 UDP 协议,因为性能高、效率好,并且语音场景下可以容忍少量信息丢失。
举例子类比记忆
UDP 类似邮寄明信片:快速送达,但可能有少量丢失。
TCP 类似挂号信:保证送达但速度慢。
知识点易错提醒
- 不要混淆实时语音通信和文件传输场景,语音一般优先选择 UDP。
延伸面试提问及应答建议
为什么语音通信选择 UDP 而非 TCP?
- 示例答句:UDP 延迟低、开销小,语音数据可容忍丢失,保证实时性;TCP 确保可靠性但延迟高,不适合实时语音。
UDP 在大规模语音系统中如何保证一定的可靠性?
- 示例答句:可通过冗余编码、丢包重传或前向纠错等技术降低丢包影响,同时保持低延迟。
