SSE 技术实践:处理为何需要手动设置 keep-alive

阅读时长 4 分钟读完

在前端开发中,Single-Page Application(SPA)已经成为了一种重要的Web应用开发方式之一。而在SPA的实现中,Server-Sent Events(SSE)就是一个非常重要的技术。SSE与WebSockets等技术类似,都是实现服务器向浏览器端发送实时事件的方式。但SSE与WebSockets不同的是,SSE可以通过HTTP协议来实现,而不用像WebSockets一样需要建立TCP连接。

SSE主要通过Server-Sent Events API来实现,通过该API,浏览器与服务器之间可以交换简单的文本消息。除此之外,SSE还有一些比较好的特性,如支持自动重连等。

SSE 中的 keep-alive 问题

但是,我们在使用SSE技术的时候,很容易遇到一个问题,就是连接断开的问题。具体来说,就是当服务器端发送的事件长时间没有更新时(如5分钟以上),浏览器端就会自动断开与服务器的连接。

这是因为HTTP协议中规定,当客户端与服务器之间没有数据交换时,服务器会在一段时间内(一般为2个TCP包的时间,约为40s)发送一个Keep-Alive(心跳)包,以防止客户端与服务器之间的TCP连接断开。这种Keep-Alive包是由操作系统内核自动发送的。

但是,对于SSE这种协议,在SSE链接状态中,并没有数据的来往,也就是说,即使连接处于空闲状态,内核也不会发送Keep-Alive包。这就造成了连接在一段时间内空闲,就会被断开的问题。为了解决这个问题,我们需要手动设置Keep-Alive。

如何手动设置 Keep-Alive

设置Keep-Alive的方法很简单,只要在服务端的HTTP响应头中加入”Connection: Keep-Alive”和”Keep-Alive: timeout=60, max=100″即可。这里timeout表示服务器发送的Keep-Alive包的时间间隔(也就是说 Keep-Alive包的间隔为60秒),max表示最多允许多少次空闲连接请求(如果连接请求达到100次,服务器就会关闭该连接)。

下面是一段node.js的 demo 代码,用于说明如何设置Keep-Alive:

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

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

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

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

以上demo代码创建了一个HTTP服务器,每秒钟向客户端发送一个当前时间。在代码中我们使用response对象来设置keep-alive。

总结

SSE技术需要手动设置Keep-Alive的原因,我们在上文中已经说明了。当然,在设置Keep-Alive的同时,我们也需要考虑一些参数的配置。尤其是在高访问量的情况下,我们需要调整timeout和max参数的值,以提高连接的性能。因此,在使用SSE技术时,我们需要了解到这些知识点,才能更好的利用SSE的优点,从而更好地实现我们的业务需求。

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

纠错
反馈