SSE全链路应用实践
一、SSE 是什么?
Server-Sent Events(SSE)服务器发送事件,是一种基于 HTTP 长连接,允许服务器单向实时推送数据到客户端的技术。
二、应用实践
1、市面上服务端推送方案对比:
从易用性,资源开销,使用场景等多维度对比了几个使用较多的主流方案, SSE更适合我们的业务场景。
2、SSE 技术选型(原生 SSE vs fetch-event-source)
原生SSE的局限问题:
1)仅支持 Get 请求:对需要传递一些复杂请求体的场景不友好。
2)不支持自定义 http header:无法支持自定义 header 透传,鉴权等场景,目前市面大部分解决方案是使用 Cookie 来携带自定义参数。
针对上述问题,微软开源的 SSE 网络库 @microsoft/fetch-event-source能够很好的解决。fes 是基于 Fetch 和 ReadableStream 来实现的 SSE 功能,旨在提供更加灵活便利的调用方式。
原生 SSE 和 fes 的对比
3、全链路支持:
客户端发送一次 SSE 请求,服务端实时推送数据到客户端,服务间上下游同样采用流式传输,实现客户端到服务端全链路流式通信。
链路层处理:
Nginx 会缓存代理服务器的响应(聚合类型),服务推送的数据被 Nginx 缓存到缓冲区,导致客户端没有实时收到数据,而是等到服务所有数据推送完后,客户端才一次性收到了所有数据。
适配方案:禁用缓存功能,需要添加非标 Header:X-Accel-Buffering: no,告知 Nginx 不缓存响应,确保数据实时发送到客户端。
三、SSE 为前后端带来的价值
1、减少请求传输耗时:无需请求多次,减少了多次请求的传输耗时。
2、前后端代码结构优化:代码更简洁且易于理解,减少串行、轮询请求的回调监听/嵌套。
3、资源利用率提升:减少冗余请求(只有一批数据时,客户端不用再次请求问询服务)
四、后续运用场景:
SSE 在服务器单向实时推送数据的场景非常适用:
实时数据流
后端长任务接口
优先数据加载