SSE
type
status
date
slug
summary
tags
category
icon
password
Blocked by
Blocking
Category
AI summary
SSE介绍
SSE 是什么?
SSE(Server-Sent Events,服务器发送事件)是一种基于 HTTP 的协议,允许服务器主动向浏览器推送数据。它常用于实时更新页面数据,比如消息推送、实时行情、通知等场景。
SSE 是一种 单向通信协议:
- 服务器 → 客户端,只能由服务器发送数据到客户端;
- 使用的是 HTTP 协议(通常是长连接);
- 由浏览器通过
EventSource
对象建立连接。
SSE 的通信过程
客户端(通常是浏览器)通过
EventSource
发起请求:浏览器会发送一个 带有特殊 Header 的 HTTP 请求:
SSE 的响应格式
SSE 服务器返回的是一种叫做 Event Stream 的特殊文本格式,内容类型必须是:
响应体是按行组织的文本流,格式如下:
字段名 | 作用说明 |
data: | 事件数据(主要内容) |
event: | 自定义事件名称(可选) |
id: | 事件 ID,用于断线重连时恢复位置 |
retry: | 设置自动重连时间(毫秒) |
示例:
- 第一条是一个
message
事件,数据是"hello world"
,ID 是 101;
- 第二条是默认事件(默认为
message
),ID 是 102;
retry
表示客户端断开连接后等待 3 秒再重连。
SSE 的优点与限制
特点 | 说明 |
优点 | 使用简单,基于 HTTP
浏览器原生支持
自动重连支持
适合广播式消息推送 |
限制 | 只能单向通信,不支持二进制传输
对代理、防火墙的长连接支持有限
移动网络连接不稳定时不适合 |
模型提问前后端交互流程
详细流程
- 前端发起一个HTTP请求(带上用户的问题和历史上下文)到golang后端的某个API(例如/
ask_model
)
- Golang后端接收到请求后,立即:
- 设置header为
Content-Type: text/event-stream
,告知前端建立SSE连接 - 异步调用pyhton大模型服务:通过gRPC的server Stream RPC或HTTP/RESTful API(流失相应),返回结果
- Python 大模型服务 接收到请求,开始进行文本生成。当生成一部分文本时,通过 gRPC 流或 HTTP 流实时地将文本块发送回 Golang 后端
- Golang 后端 实时接收到 Python 服务返回的文本块,将这些文本块封装成 SSE 事件格式 (
data: your_text_chunk\n\n
)
- Golang 后端 使用
Flusher.Flush()
立即将这些 SSE 事件推送到前端通过EventSource
建立的 SSE 连接上
- 前端的EventSource.onmessage事件被触发,获取数据,实时更新UI界面
- 当Python服务完成推理后,关闭gRPC流或HTTP流
- Golang后端检测到上游流关闭,关闭SSE连接,或者是前端收到特定结束事件后,由前端主动断开连接
示例代码
理解OpenAI通过SSE传输数据
Prev
【Mysql学习笔记】索引篇
Next
Go 学习总结
Loading...