
🧠 记忆锚点:以服务器持续推送为主选 SSE;需要频繁双向实时交互选 WebSocket,同时都要处理取消、重连和背压。
💡 答案要点
流式输出的价值:
- 降低首字延迟(TTFT),提升用户体验
- 用户可以边看边思考,不用等完整答案
- 节省服务器内存(不用缓存完整响应)
实现方案对比:
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| SSE | 简单、原生支持、自动重连 | 单向通信(服务器→客户端) | 大多数 AI 问答场景 |
| WebSocket | 双向通信、低延迟 | 实现复杂、需要心跳 | 需要客户端交互的场景 |
SSE 实现示例(Go):
go
func streamHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
flusher, _ := w.(http.Flusher)
// 调用 LLM API(流式)
stream, _ := client.CreateChatCompletionStream(...)
for {
response, _ := stream.Recv()
if errors.Is(err, io.EOF) {
break
}
// 发送 SSE 事件
fmt.Fprintf(w, "data: %s\n\n", response.Choices[0].Delta.Content)
flusher.Flush()
}
}面试话术:
"如果主要是服务器向客户端单向推送 token,SSE 通常更简单;需要持续双向音频、客户端实时控制或低延迟交互时再考虑 WebSocket 或 WebRTC。选型依据是通信方向、断线恢复、代理兼容性和背压,而不是固定比例。"