Java基于SSE流式返回
1. 服务器推送技术价值
传统”拉取”模式需客户端主动发起请求获取更新,而服务器推送采用”推送”机制实现实时信息传输。其核心优势体现在:
- 实时性提升:系统自动推送最新内容,免去用户手动刷新操作
- 资源优化:仅在产生有效数据时建立连接,减少无效请求
- 用户体验升级:消息即时触达,适用于实时通信场景
2. 服务器推送主流实现技术对比
2.1. 长轮询(Long Polling)
- 客户端维持长连接等待服务器响应
- 兼容性优秀但资源消耗较高
2.2. 服务器发送事件(SSE)
- 基于HTTP协议
- 单向通信
- 适合只需要服务器向客户端推送实时更新数据的场景,如实时新闻更新、股票行情推送等
2.3. WebSocket
全双工TCP通信协议
双向通信
适合需要客户端和服务器之间进行实时双向通信的场景,如聊天室、在线游戏等
3. Java 基于okhttp请求SSE接口流式返回
3.1. 整体结构简述
整个流程理解为 两个 SSE 连接的“接力”传输:
3.1.1. 第一个 SSE 连接:
前端发起, 后端给前端推数据
- 使用
SseEmitter
实现。 - 前端通过
EventSource
发起请求。 - 后端接收请求并创建
SseEmitter
,用于向前端推送数据。 - 这个连接是你主动控制的,用来与用户通信。
3.1.2. 第二个 SSE 连接:
后端发起,AI 接口给后端推数据
- 使用 OkHttp 的
EventSource.Factory
创建。 - 后端向 AI 模型服务发起流式请求。
- 接收模型返回的逐字输出(如 AI 流式回答)。
- 这个连接是代理性质的,用来获取远程 AI 数据。
1 |
|
3.2. 核心代码
- 我们可以借助okhttp来实现,首先引入okhttp-sse的依赖:
1 |
|
- 核心代码
1 |
|
4. 当前端取消请求时,通知后端也立即中断 AI 的处理流程
4.1. 流程
前端取消请求时,通知后端取消对应的 AI 请求
- 前端使用
useFetchHook
(假设是基于fetch
或axios
)时,可以使用AbortController
来中断请求。 - 前端中断请求后,主动发送一个取消请求到后端,告诉后端“我不要这个请求了,请取消 AI 推理”。
4.2. 前端实现(Vue + useFetchHook)
1 |
|
4.3. 后端实现
1 |
|
1 |
|
注:如果使用 Redis,可以将 session 信息存入 Redis,实现分布式取消。
Java基于SSE流式返回
http://example.com/Java基于SSE流式返回/