Skip to content

什么是 SSE(Server-Sent Events)?

SSE 是一个服务端单向推送协议,基于 HTTP 长连接,服务端可以主动将事件推送至客户端,实现流式数据传输。

SSE 工作原理

  1. 客户端发起一个带有特殊请求头的 HTTP 请求,要求服务端使用 SSE 协议。

  2. 服务端返回对应请求头,并以 SSE 数据流格式持续发送消息,连接不关闭。

    • 消息格式:每条消息以 data: 开头,\n\n 结尾
  3. 客户端使用 EventSource 接口持续接收消息。

为什么需要 SSE

  • 传统 HTTP 请求-响应模型无法满足大模型流式输出需求,轮询/长轮询资源消耗大且延迟高。

  • SSE 可以在一个长连接中多次持续发送大模型响应,实现流式输出效果,提升用户体验。

为什么不用 WebSocket

  • WebSocket 支持全双工且可以定制会话状态管理,但实现复杂、资源占用大。

  • 大模型应用只需要服务端单向流式输出,所以轻量的 SSE 更合适。

    • 如果需要支持用户在输入过程中打断生成(如语音对话),可考虑 WebSocket。

SSE 和 WebSocket 的区别

特性SSEWebSocket
通信方向单向全双工
协议基础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 在大规模语音系统中如何保证一定的可靠性?

    • 示例答句:可通过冗余编码、丢包重传或前向纠错等技术降低丢包影响,同时保持低延迟。