什么是 SSE
SSE(Server-Sent Events)是一种基于 HTTP 的轻量级消息推送协议。通常用于实现服务端主动向客户端推送数据的场景,例如在线聊天、股票行情推送等。相比传统的轮询方式,SSE 具有推送实时性好、数据量小、延迟低等优点,而且支持全双工传输,适用于客户端与服务端需要频繁交互的业务场景。
SSE 的架构
SSE 的实现基于浏览器原生的 EventSource API,可以通过以下简单的 JavaScript 代码建立 SSE 连接:
const eventSource = new EventSource('/sse'); eventSource.onmessage = function(e) { console.log('Received message:', e.data); }; eventSource.onerror = function(e) { console.error('SSE error:', e); };
服务端需要以流的方式向客户端发送数据,每条消息都需要包含固定的格式和事件类型,例如:
-- -------------------- ---- ------- -------- --- -- ------------- ----------------- -------------- -------- ------ ------ ----- ---------------------- ------ ------ ----- ---------------------- ------ -----
上述数据包含两个事件类型为 update 的消息和一个事件类型为 close 的消息,客户端在接收到数据后可以根据事件类型进行业务处理。
如何减少占用系统资源
SSE在消息推送过程中占用系统资源,尤其是在高频率消息推送的场景下,容易导致服务器负载过高,影响系统稳定性。为了减少占用系统资源的问题,我们可以采用以下方法:
1. 设置合理的心跳
SSE 消息传输的过程中,服务端需要定期向客户端发送心跳消息以保持连接。心跳间隔时间长,则容易导致连接超时;心跳间隔时间短,则会占用过多的系统资源。因此,需要设置合理的心跳间隔时间,一般推荐为不超过 30 秒。
:ping event: ping data: {}
2. 合理使用流控制
SSE 消息推送的时候,需要判断客户端是否在线。如果客户端不在线,则不需要向客户端推送数据,避免浪费资源。另外,还可以根据客户端接收消息速度的情况,动态调整消息推送速度,避免同时给客户端推送大量消息。
-- -------------------- ---- ------- --- ----------- - ----- --- -------------- - ----- --- --------- - -- ------------------- ---------- - -- ----------- ------- -- -- --------------- - -- - ---------------- - --- -------- --------------- - -- ---------- - -- - -- -------------- ------------------------- ----------- ------- - -- --------------- --- ----- - -- ---- ------- -- ----- --------- - ---------------- ------------------- -------------------- ---------------------- ----------------------- --------------------- ------------------------ ----------- - ------------- -------------- - ------------ - -- ------------------------- ----- - ---- - -- ------ ----- --------- - -------------------- -- ---------- --- ----- - ------------------------- ------ ------- - ------------------- -------------------- ---------------------- ----------------------- --------------------- ------------------------ ----------- - ------------- ------------------------- ----- - -
3. 压缩传输数据
对于不带有二进制数据的 SSE 消息,可以进行 Gzip 压缩以减小数据传输量,提升传输效率。
-- -------------------- ---- ------- ----- ---- - ---------------- -------- ------------------ ---- - ----- -------------- - ------------------------------- -- --------------- -- -------------------------------- - --------------------------------- -------- ------------------ ---------------- ---------------------- ------------------------------------- - ---- - ------------------ ---------------- ---------------------- -------------- - -
总结
以上就是减少 SSE 占用系统资源的方法,对于频繁消息推送的服务来说,使用 SSE 可以减小轮询请求的压力,提升系统的稳定性和响应速度。我们需要在实际业务场景中结合参数调试、压力测试等手段,得出合理的配置参数,以达到最优的性能表现。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e3589df6b2d6eab3ecbd4f