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 浏览器原生支持 自动重连支持 适合广播式消息推送
限制
只能单向通信,不支持二进制传输 对代理、防火墙的长连接支持有限 移动网络连接不稳定时不适合
 

模型提问前后端交互流程

详细流程

  1. 前端发起一个HTTP请求(带上用户的问题和历史上下文)到golang后端的某个API(例如/ask_model)
  1. Golang后端接收到请求后,立即:
    1. 设置header为 Content-Type: text/event-stream,告知前端建立SSE连接
    2. 异步调用pyhton大模型服务:通过gRPC的server Stream RPC或HTTP/RESTful API(流失相应),返回结果
  1. Python 大模型服务 接收到请求,开始进行文本生成。当生成一部分文本时,通过 gRPC 流或 HTTP 流实时地将文本块发送回 Golang 后端
  1. Golang 后端 实时接收到 Python 服务返回的文本块,将这些文本块封装成 SSE 事件格式 (data: your_text_chunk\n\n)
  1. Golang 后端 使用 Flusher.Flush() 立即将这些 SSE 事件推送到前端通过 EventSource 建立的 SSE 连接上
  1. 前端的EventSource.onmessage事件被触发,获取数据,实时更新UI界面
  1. 当Python服务完成推理后,关闭gRPC流或HTTP流
  1. Golang后端检测到上游流关闭,关闭SSE连接,或者是前端收到特定结束事件后,由前端主动断开连接

示例代码

 
 
理解OpenAI通过SSE传输数据
 
Prev
【Mysql学习笔记】索引篇
Next
Go 学习总结
Loading...
Article List
如果去做,还有一丝希望;但是不去做,就毫无希望
技术分享
个人总结
k8s
MQ
linux
MongoDB
golang
Golang
Linux
转发
Redis
Mysql