SSE 如何解决由服务端推送消息率过高带来的性能问题

阅读时长 4 分钟读完

随着 Web 技术的不断发展,现在越来越多的应用需要利用服务端推送消息。当服务器频繁地向客户端推送消息,例如实时聊天、股票实时行情等情境,会给服务器带来很大的负担,甚至可能导致服务器崩溃。这种情况下,SSE(Server-Sent Events)成为了解决方案。

什么是 SSE

SSE 是 HTML5 中的一种实现服务器向客户端推送消息的 API。SSE 只能用于从服务器到客户端的单向通信,客户端无法向服务器发送消息。

SSE 的优点

SSE 优点如下:

  • 省略了很多类似 WebSocket 的复杂实现,只需在服务端实现即可。
  • 服务器不断地向客户端推送消息,与客户端长连接和轮询不同,不需要大量的请求和响应头,因此很省带宽。
  • 对于浏览器兼容性方面,主流浏览器均能支持 SSE。

经过比较,SSE 在服务器推送频繁消息的情境中表现优异,这也是它广泛运用于实时消息发送场景的原因之一。

如何使用 SSE

SSE 是通过在服务端向客户端发送特殊格式的事件来实现的。开启 SSE 的方式有两种:

使用 JS API

-- -------------------- ---- -------
--- --- - --- ------------ ---- --- --

------------- - -------- ------- -
    ------------------------ -------------
--

----------- - -------- ------- -
    --------------------- --------
--

----------- - -------- ------- -
    ------------------- ---- --- --
--

原生 HTML

其中,/url 是服务器推送消息的地址。

示例

服务端实现

-- -------------------- ---- -------
---- ---- --
----- ---- - ----------------

-------- ------------ --- ----- ---------- -
    --- ------- - ---
    -- ----------- -
        ------- -- ------- ----------------
    -
    ------- -- ---- ---------
    ------- -- ------ -----------------------------
    -------------------
-

----------------------- -------
    ---------------------------------------
    ----------------------------- ---------------------
    ------------------------------ ------------
    --------------------------- --------------
    --- -- - --
    -----------------
        -----
        ------------ --- --------- ----------- -- - ---------
    -- ------
----------------
------------------- ------- -- -------------------------

该代码启动后,会在 http://localhost:3000/ 上启动成功,每隔一秒钟向客户端推送一条信息,id 递增,消息体为 这是服务器发送的消息 id 为 ${id}

客户端实现

客户端使用 XMLHttpRequest 对象来发起 HTTP 请求,获取 SSE 数据。以下代码是一个简单的 SSE 客户端实现:

该代码会不断地在浏览器控制台输出服务端返回的数据。客户端通过 EventSource API 发起与服务端的 SSE 连接,不断接收服务端发送的消息,浏览器支持 SSE,不需要像 WebSocket 那样在 Node.js 中安装 ws 包以及在客户端写 WebSocket 的兼容性判断代码。

总结

SSE 是一种存在广泛使用价值的技术,它解决了由服务端推送消息频繁导致的性能问题,同时还省去了与 WebSocket 相比较的复杂实现。SSE 兼容性良好,只需在服务端实现即可,对 Web 开发人员而言,掌握这项技术是非常有必要的。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e2ed0ff6b2d6eab3e3939a

纠错
反馈