SSE

前言

随着 ChatGPT 的流行,SSE(Server Send Event) 这种请求方式也进入大众的视野。

chatgpt.gif

能够发现在接口发出之后,内容是逐渐返回的,一直处于连接状态且不断的有新的内容推送到接口中。

概述

Server-Send Events 为服务器推送事件,简称 SSE,是服务器主动向客户端推送数据的。

是 HTML5 规范中的一员,主要由 HTTP 协议和EventSource对象组成。

这种服务端实时向客户端发送数据的传输方式,其实就是基于 EventStream 的事件流。

SSE 的使用好处

在我们通常需要等待服务端返回数据的过程称为轮询。

技术原理

协议

  1. 使用 SSE 来做服务器端向客户端做数据的实时推送,需要将对应的 http 响应头 contentType 设置为 text/event-stream
  2. 由于所有的数据都是实时推送的,因此不需要有缓存,Cache-Control 设置为 no-cache
  3. SSE 本质还是一个 TCP 连接,且为了保持长时间开启,要将 Connection 设置为 keep-live
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive

消息格式

EventStream 为 UTF-8 编码格式的文本或者 Base64 编码和 gzip 压缩的二进制消息。

每一条消息由一行或者多行字段(eventidretrydata)组成,每行字段为字段名:字段值

字段以行为单位,每行以\n结尾。以冒号开头的行为注释行,会被浏览器忽略。

每次推送,可由多个消息组成,每个消息之间以空行分隔(即最后一个字段以\n\n结尾)。