简介(未完成)
sse
SSE(Server-Sent Events,服务器推送事件)是一种基于 HTTP 的网络通信协议,允许服务器向客户端单向推送实时数据。主要特点
- 高效的单向通信:专为服务端到客户端的单向通信所设计,完美匹配大模型场景(客户端发送一次请求,服务端持续返回流式结果)。
- 低延迟:每次生成一个逻辑段落或标记(token)即可立即推送,避免传统 HTTP 请求-响应模式的长等待。
- 轻量协议:基于HTTP/HTTPS,无需额外协议握手(如 WebSocket 的双向协商),减少连接开销。
SSE依赖client端先建立起同server端的连接之后,server端才能向这个连接进行push。换句话说,SSE本质上其实还是由client主动发起交互的,用于实现一些流式的效果,但server端不能随时发起一个交互(至少在一个常规的实现中是这样的)。sse响应的不是一个简单的数据包,而是一个持续不断的流信息(stream)。这就像是一次耗时很长的下载过程,让数据源源不断地流向客户端。
协议格式(只需记 4 个字段)
- Header
Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive - Body
field: value\n\n /* 每条消息以两个换行结束 */服务器发送给浏览器的body必须按上述k-v格式符合,其中field的类型是固定的四种字段:
- data 实际负载
- id 事件序号,断线续传用
- event 事件类型,前端 addEventListener(‘event名’)
- retry 断线重连间隔(ms)
JSON-RPC 2.0
JSON-RPC 2.0 是一种无状态、轻量级的远程过程调用(RPC)协议,协议定义了请求和响应的格式,以及错误处理机制。消息骨架(记住 4 个固定key)
以下是转换后的Markdown表格:
| 键 | 必选 | 类型 | 作用 |
|---|---|---|---|
| jsonrpc | ✅ | 固定值 “2.0” | 协议版本号 |
| method | ✅ | string | 远端要执行的函数名 |
| params | ❌ | object / array | 入参 |
| id | ❌ | string/number/null | 客户端生成的请求匹配符;无 id 视为通知,不期待回复 |
| result / error | 二选一 | string/number/null | 成功返回 result,失败返回 error |
请求
{ "jsonrpc": "2.0", "method": "...", "params": {...}, "id": <unique> }
响应
{ "jsonrpc": "2.0", "id": <same>, "result": {...} } // 成功
{ "jsonrpc": "2.0", "id": <same>, "error": {code, message, data?} } // 失败
websocket
实时性是互联网应用中诸多场景的刚需。如果仅靠 RESTful API 的请求-响应模型,客户端要么需要不断轮询服务器,要么只能被动等待。前者带来资源浪费,后者无法满足实时性。因此,WebSocket 就应运而生,它们提供了从服务端主动推送消息到客户端的能力,但方式和适用场景有所不同。
WebSocket 是一种网络通信协议,允许在客户端和服务器之间建立全双工、持久的连接(一般client与server 之间有lb,lb 要配置session sticky?),实现实时、双向的数据传输。不同于 SSE,WebSocket 连接一旦建立,双方可以随时发送数据,实效性更强,即无须等待服务端返回内容,客户端就能发起请求,适用于多人在线游戏操作实时同步、社交软件的聊天室、在线文档多人同时编辑等。主要特点是:
- 全双工通信:客户端和服务器可以同时发送和接收数据。
- 持久连接:连接建立后保持打开状态,直到主动关闭。
- 低延迟:数据可以即时传输,适合实时应用。
需要独立的协议升级、长连接管理、心跳检测,复杂网络(防火墙、代理、负载均衡)
sse vs websocket
| SSE | WebSocket |
|---|---|
| 基于 HTTP 的轻量级协议 | WebSocket 是独立的协议 |
| 基于 HTTP 请求 Accept: text/event-stream 本质上,HTTP 协议是无法实现主动推送消息的,约定text/event-stream后,客户端便不会断开该连接,并持续从该连接上接收数据流。 |
WebSocket 借助 HTTP 升级协议 Upgrade: websocket,之后使用独立协议 |
| 伪双工,只支持服务端到客户端的单向通信,客户端到服务端的通信还需要另外发送 HTTP 请求进行 | 全双工的双向通信 |
| 简单、轻量,适合单向低频推送 | 复杂度高、实时性强,适合双向高频交互 |