1. 项目背景与需求分析
最近在开发一个AI健康问答系统时,遇到了典型的响应延迟问题。初始实现采用传统的同步HTTP接口,用户提交问题后,前端需要等待AI生成完整答案才能展示结果。实测发现,当问题复杂度较高时,后端处理时间经常超过10秒,导致用户体验极差。
核心痛点在于:AI模型实际上是逐词(token-by-token)生成内容的,但我们的接口设计却强迫它必须生成完整答案后才能返回。这就好比让快递员必须买齐所有商品才能送货,而不是买到一件送一件。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SSE技术选型解析
2.1 为什么不是WebSocket?
WebSocket虽然是全双工通信协议,但对于AI问答这种单向数据推送场景显得过于重量级。它需要:
- 建立独立的TCP连接
- 实现复杂的心跳机制
- 处理二进制帧解析
2.2 为什么不是长轮询?
长轮询(Long Polling)本质仍是客户端主动请求,存在:
- 不必要的网络开销
- 消息延迟不可控
- 服务端连接占用
2.3 SSE的核心优势
Server-Sent Events的独特价值体现在:
- 基于标准HTTP协议,无需特殊基础设施
- 自动重连机制(默认3秒)
- 极简的事件流格式:
http复制event: message
data: {"content":"你好"}
data: 这是第二段文本
id: 12345
3. Spring Boot实现详解
3.1 控制器层改造
传统接口:
java复制@PostMapping("/query")
public Response<Answer> handleQuery(@RequestBody Question q) {
Answer answer = aiService.generate(q);
return Response.success(answer);
}
改造为SSE接口:
java复制@GetMapping(path = "/stream", produces = TEXT_EVENT_STREAM_VALUE)
public SseEmitter streamQuery(Question q) {
SseEmitter emitter = n
