SSE vs 长轮询,谁才是更好的选择?

阅读时长 7 分钟读完

前端开发中,我们常常需要将实时数据在页面上展示给用户,在实现这个功能的时候,我们就会有选择 SSE(Server-Sent Events) 和长轮询的疑惑,今天我们来探讨一下这两种技术的利弊以及适用场景。

什么是 SSE 和长轮询?

先来简单介绍一下 SSE 和长轮询。

SSE 是一种 HTML5 规范,它允许服务器将数据实时推送到客户端,客户端通过 EventSource 对象接收服务端发送的数据。相较于 Ajax 请求,SSE 更加节省网络开销,减少了不必要的请求,因此性能更优。

长轮询是指客户端像服务端发起一个请求,如果服务端没有数据更新,那么服务端就会一直 hold 这个请求,直到有实时数据变化才回复该请求并返回数据,同时客户端收到数据后立即再次发起一个新的请求,如此往复。这种方式虽然能实现实时更新数据,但毕竟需要大量的轮询请求,也会给服务端造成比较大的压力。

SSE 和长轮询的利弊对比

优点

SSE

  • 服务端只需要进行一次响应,前端不需要再次向服务端发起请求,减少了前后端之间的通信。
  • 不需要像 WebSocket 轮询连接状态,节省了性能开销。
  • 可以更轻松地处理在连接过程中断开的情况,同时 SSE 在浏览器和服务端之间只需要一个 HTTP 连接,能够比较好的避免连接频繁的问题。

长轮询

  • 相对于 SSE,因为数据变化时客户端主动发起请求的方式,长轮询在各种浏览器和后端都有良好的兼容性。
  • 与 SSE 相比,长轮询有更好的扩展性,因为长轮询可以在任何情况下使用,而 SSE 只能使用在对 SSE 做了特殊处理的服务。
  • 在处理一些较为差的网络情况时,长轮询是一个更好的选择。因为只有在客户端请求到数据之后才会关闭请求,可以减少客户端上开启不必要的请求带来的开销。

缺点

SSE

  • SSE 目前 Safari 浏览器不支持,降低了该技术的可行性。
  • SSE 收到的数据是 string 类型,因此需要加以处理后才能使用。

长轮询

  • 需要频繁的 HTTP 连接和请求,一旦用户量过大,将会对服务端造成较大压力。
  • 容易造成响应时间延长和负载过高的情况。

如何选择?

那么如何选择 SSE 和长轮询呢?通常会根据实际需求以及服务端的性能来选择。

SSE 在服务端推送较为频繁的情况下,能够有效降低连接频繁的问题,同时减少 HTTP 连接产生的带宽资源。但是在一些浏览器不支持 SSE 的情况下,该技术将无法使用。

长轮询则可以在各种浏览器和后端都兼容的情况下使用,适合在数据变化不大的情况下使用,同时在处理一些较为差的网络情况时,也是一个更好的选择。

最终,在实际开发中,我们可以根据实际的需求和服务端性能来灵活选择 SSE 和长轮询,以达到最优化的效果。

示例代码

SSE 示例代码

服务端代码:

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

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

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

HTML 代码:

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

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

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

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

长轮询示例代码

服务端代码:

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

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

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

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

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

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

HTML 代码:

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

结论

综上所述,SSE 和长轮询在实际使用过程中都各有利弊,需要根据实际需求灵活选择。如果需要实时地推送数据,SSE 是更优的选择;如果数据变化不是很频繁,则可以选用长轮询。

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

纠错
反馈