Node.js 中的长轮询 (Long Polling)

2025年3月15日 | 4分钟阅读

在本文中,我们将讨论 Node.js 中的长轮询,包括其工作原理、特性、示例、优点和缺点。

什么是长轮询?

长轮询是一种实现方法,用于在线应用程序,允许客户端和服务器几乎同时交换数据。这使得服务器可以在客户端不发起请求的情况下向客户端发送数据。与服务器尽快响应客户端请求的典型 TCP 连接不同,服务器会保持请求,直到有新数据可用,届时它会发送响应。如果在一段时间后磁盘上没有找到数据,服务器会返回无数据,并且客户端会立即发出请求,形成一个轮询循环。

长轮询在 Node.js 中如何工作?

  1. 客户端发送请求: 客户端向服务器发送 HTTP 请求,请求更新或新数据。
  2. 服务器保持请求: 服务器会花时间响应命令。但是,它只持续这个过程,直到输入新数据或进入所谓的“超时”。
  3. 服务器响应: 当服务器有新数据或时间限制过去时,客户端会等待服务器的响应。
  4. 客户端重新请求: 作为响应,客户端分析数据并获得结果后,客户端会立即向服务器发送一个新请求以等待。
  5. 这种循环使得近乎实时地更新成为可能,而无需像短轮询那样进行频繁的轮询。

长轮询的特性

长轮询的几个特性如下:

  1. 实时数据
    长轮询适用于客户端需要实时信息的应用程序,因为它允许客户端在服务器有新数据时保持连接。
  2. 高效的资源利用
    服务器在此模型中保持请求打开,从而创建更少的连接。因此,与短轮询相比,服务器开销相对较小。
  3. 备选方案
    当由于网络限制或客户端限制而无法使用 WebSockets 或 Server-Sent Events (SSE) 时,长轮询非常有用。
  4. 简单性
    由于它可以与标准 HTTP 请求集成,因此适用于没有实时通信库可用的环境。

示例

让我们以一个例子来说明 Node.js 中的长轮询。

输出

Long Polling in Node.js

优点

长轮询的几个优点如下:

  • 它能够以最少的配置实现近乎实时的通信。
  • 它可以在所有当前的 Internet 浏览器上使用,或者使用标准的 http。
  • 它适用于流量较低的情况,或者 WebSocket 不是一种选择的情况。

缺点

长轮询的几个缺点如下:

  • 与 WebSockets 相比,它在实时消息传递方面效率较低,尤其是频繁的消息。
  • 如果没有新数据可用,延迟会很高,这会导致高延迟。
  • 它倾向于要求模型客户端频繁地管理重新连接过程,这会增加它们。

用例

长轮询的几个用例如下:

  • 实时通知: 长轮询还可以用于让客户端了解实时发生的事件,例如聊天应用程序中的消息,要求客户端不断轮询服务器。
  • 监控系统日志: 使用长轮询,可以实时向用户告知系统事件或错误,例如服务器或监控系统中的日志更新。
  • 股市更新: 对于需要实时更新信息的股票报价等情况,长轮询可以稳定地向客户端提交更新,而不会因持续的请求而淹没服务器。
  • 社交媒体动态: 在社交平台或协作应用程序中,可以实现长轮询以在新的更新或帖子可用时立即通知用户。

结论

总之,Node.js 中的长轮询提供了一种通过现有的 http 请求实现实时通信的方法。虽然它不像 WebSockets 那样高效,但对于需要频繁数据更新、低延迟且无法实现更复杂技术的应用程序来说,它是一种可行的长期解决方案。通过使用 Node.js 和 Express,开发人员可以实现长轮询,以便在数据可用时将其推送到客户端。当需要更新数据部分但无法保持连接持久时,它尤其有用。