Page 260 - Web性能权威指南
P. 260
GET /stream HTTP/1.1 ➌
Host: example.com
Accept: text/event-stream
Last-Event-ID: 43
<= 响应
HTTP/1.1 200 OK ➍
Content-Type: text/event-stream
Connection: keep-alive
Transfer-Encoding: chunked
id: 44 ➎
data: dolor sit amet
➊ 服务器将客户端的重连间隔设置为 4.5 s
➋ 简单文本事件,ID:43
➌ 带最后一次事件 ID 的客户端重连请求
➍ 服务器以 'text/event-stream' 内容类型响应
➎ 简单文本事件,ID:44
客户端应用不必为重新连接和记录上一次事件 ID 编写任何代码。这些都由浏览器
自动完成,然后就是服务器负责恢复了。值得注意的是,根据应用的要求和数据流,
服务器可以采取不同的实现策略。
• 如果丢失消息可以接受,就不需要事件 ID 或特殊逻辑,只要让客户端重连并恢
复数据流即可。
• 如果必须恢复消息,那服务器就需要指定相关事件的 ID,以便客户端在重连时报
告最后接收到的 ID。同样,服务器也需要实现某种形式的本地缓存,以便恢复并
向客户端重传错过的消息。
当然,像要保留多少条消息这种细节一定取决于具体的应用。另外,要知道 ID 是
可选的事件流字段。而服务器也可以在交付的事件流中对特定消息设置检查点或者
里程碑标记。一句话,根据你的需求,实现服务器逻辑。
16.3 SSE使用场景及性能
SSE 是服务器向客户端发送实时文本消息的高性能机制:服务器可以在消息刚刚生
成就将其推送到客户端(低延迟),使用长连接的事件流协议,而且可以 gzip 压缩
(低开销),浏览器负责解析消息,也没有无限缓冲。再加上超级简单的 EventSource
API 能自动重新连接和把消息通知作为 DOM 事件,使得 SSE 成为处理实时数据不
可或缺的得力工具!
248 | 第 16 章