SSE 如何解决多长连接对后端 Redis 带来的负担

阅读时长 3 分钟读完

随着现代 Web 应用的发展,前端与后端之间需要进行实时通信的场景越来越多,其中一种实现方式是使用长连接(Long Polling)。长连接是指客户端与服务器建立一个长时间的连接,当服务器有数据返回时,就立刻将数据推送给客户端,在一定时间内保持连接,再由客户端主动断开连接。

虽然长连接可以实现实时通信,但是当用户访问量较大时,会对后端 Redis 服务器产生巨大的负担,造成性能问题。SSE 即 Server-sent Events,是一种与长连接类似的技术,但是能够有效地减轻后端负担。

SSE 原理

SSE 是一种 HTML5 规范,允许服务器发送事件流(Event Stream)到客户端,利用 HTTP 的标准请求-响应方式,与服务器建立单向连接,再由浏览器进行事件监听。SSE 的建立过程如下:

  1. 客户端发起一个 HTTP 连接到服务器,请求订阅某个事件流。
  2. 服务器响应并建立连接,向客户端发送数据,并在 HTTP 响应头中设定 "Content-Type: text/event-stream"。
  3. 客户端通过 EventSource 对象监听事件流,处理服务器发送的数据。

在服务器端,我们可以使用 node.js 框架的 express 和 SSE 模块来实现 SSE:

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

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

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

客户端使用对应的 EventSource 对象进行监听,如下:

SSE 的优势

相较于长连接,SSE 的优势在于:

  1. 协议独立。SSE 使用类似于 HTTP 的协议,因此不需要额外的协议库。
  2. 简单易用。使用 SSE 只需要浏览器端的 JavaScript 代码和服务器端的 SSE 实现,相较于 WebSocket 更易于使用和实现。
  3. 减轻后端负担。SSE 建立的是单向连接,不需要客户端发送大量数据,减轻后端的压力。

相较于 WebSocket,SSE 协议不提供双向通信,只能客户端订阅服务器端事件流,因此适用于一些不需要建立实时双向通信的场景。

结论

基于 SSE 技术的实时通信方式不仅适用于个别 Web 应用场景,通过 SSE 的单向连接,SSE 可以有效地解决多长连接对后端 Redis 带来的负担问题,从而优化 Web 应用的性能表现。

如果需要进行高并发或者实时双向通信,可以考虑使用 WebSocket 等技术。

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

纠错
反馈