《系统设计》课程学习笔记—长轮询、WebSocket和服务器发送事件(SSE)

100 阅读4分钟

Web应用程序最初是围绕客户端-服务器模型开发的,其中Web客户端始终是事务的发起者,例如从服务器请求数据。因此,服务器没有机制在客户端不首先发出请求的情况下独立地向客户端发送或推送数据。让我们讨论一些克服这个问题的方法。

长轮询

HTTP长轮询是一种用于将信息尽快从服务器推送到客户端的技术。其中服务器不必等待客户端发送请求。

在长轮询中,服务器接收到来自客户端的请求后不会关闭连接。而是服务器仅在任何新消息可用或达到超时阈值时才响应。

long-polling.webp

一旦客户端接收到响应,它立即向服务器发送一个新请求,请求建立一个新的挂起连接向客户机发送数据,然后重复该操作。使用这种方法,服务器模拟实时服务器推送功能。

工作方式

让我们了解长轮询如何工作:

  • 客户端发出初始请求并等待响应。
  • 服务器接收请求并延迟发送任何内容,直到更新可用。
  • 更新可用后,响应将发送到客户端。
  • 客户端接收响应并立即或在某个定义的时间间隔之后发出新请求,以再次建立连接。

优点

以下是长轮询的一些优点:

  • 易于实施,适用于小型项目。
  • 几乎所有应用都支持。

缺点

长轮询的一个主要缺点是它通常不可扩展。以下是一些其它问题:

  • 每次创建一个新连接,对服务器压力较大。
  • 对于多个请求,可靠的消息排序可能是一个问题。
  • 由于服务器需要等待新请求,延迟增加。

WebSocket

WebSocket 通过单个TCP连接提供全双工通信信道。它是客户端和服务器之间的持久连接,双方可以使用它随时开始发送数据。

客户端通过称为 WebSocket 握手的过程建立 WebSocket 连接。如果该过程成功,则服务器和客户端可以随时在两个方向上交换数据。WebSocket 协议能够以较低的开销实现客户端和服务器之间的通信,从而促进与服务器之间的实时数据传输。

websockets.webp

这是通过为服务器提供一种标准化的方式来向客户端发送内容而不被询问,并允许消息在保持连接打开的同时来回传递而实现的。

工作方式

让我们了解 WebSocket 是如何工作的:

  • 客户端通过发送请求启动 WebSocket 握手过程。
  • 请求还包含一个HTTP升级头,允许请求切换到WebSocket协议(ws://)。
  • 服务器向客户端发送响应,确认 WebSocket 握手请求。
  • 一旦客户端接收到成功的握手响应,就会打开WebSocket连接。
  • 现在,客户端和服务器可以开始在两个方向发送数据,从而允许实时通信。
  • 一旦服务器或客户端决定关闭连接,连接就会关闭。

优点

以下是WebSocket的一些优点:

  • 全双工异步消息传递。
  • 更好的基于源的安全模型。
  • 客户端和服务器都是轻量级的。

缺点

让我们看一下 WebSocket 的一些缺点:

  • 终止的连接不会自动恢复。
  • 较老的浏览器不支持WebSocket(不是很重要)。

服务器发送事件(SSE)

服务器发送事件(SSE)是一种在客户端和服务器之间建立长期通信的方法,使服务器能够主动将数据推送到客户端。

server-sent-events.webp

它是单向的,这意味着一旦客户端发送请求,它就只能接收响应,而不能通过同一连接发送新请求。

工作方式

让我们了解服务器发送事件如何工作:

  • 客户端向服务器发出请求。
  • 客户端和服务器之间的连接已建立,并保持打开状态。
  • 当新数据可用时,服务器向客户端发送响应或事件。

优点

  • 易于实现且客户端和服务器均可使用。
  • 大多数浏览器都支持。
  • 不会受到防火墙影响。

缺点

  • 单向性可能是限制。
  • 打开连接的最大数量限制。
  • 不支持二进制数据。