如果我从 Javascript 轮询切换到 websockets,这会减少服务器负载吗?

If I switch from Javascript polling to websockets, will that reduce server load?

我有一个 Web 应用程序,它为本地网络上的用户提供仪表板类型的显示。它通过服务器的 AJAX 轮询提供许多不同进程和系统的状态更新。我们已经到了服务器负载过大的地步(这是内存不足的旧硬件)。我们将在接下来的几个月内升级,但我正在考虑从轮询服务器切换到 websockets 并将事件推送到客户端。

鉴于对服务器的请求数量将大幅减少,因为服务器将向客户端推送通知,我认为应该减少服务器负载。这是正确的吗?

编辑

该应用程序是用 PHP 编写的,使用 Laravel framework and is running on a set of Docker containers with Apache as the web server using the ratchet 库来实现 websockets 的服务器端。从 PHP 更改为节点等其他实现不切实际,但可以更改 Web 服务器。

我已经实现了一些推送(websocket)和轮询机制(HTTP),根据我的经验,如果有多个客户端机器都在不断地轮询服务器以获取状态更新并且你切换它以便服务器代替发生状态更新时向每个客户端发送状态更新有许多潜在的好处:

  1. 数据仅在初始连接时发送到客户端,随后发生更新时(因此频率较低)。没有检查尚未发生的更新的请求。
  2. 服务器只需在新客户端连接或后续更新时执行生成响应的工作(尽管缓存也可以解决此问题)。
  3. 根据我编写 websocket 和 HTTP API 的经验,websocket 更高效,因为没有连接和授权每个请求的开销,只有第一个连接有开销,之后数据可以通过同一连接发送(双向) ) 而无需连接和重新授权客户端(例如密钥、用户名和密码——如果这是一个要求)。

确保您使用的网络服务器是专为处理 websocket(通常是长连接)而设计的,我的经验是使用 Tornado,它是非阻塞的并且非常适合,但许多网络服务器可以或可以配置为.

如果您也坚持轮询(例如,每次更新时都缓存仪表板的状态,以便请求仅调用静态文件),那么很有可能会有一个解决方案。但是在回答你的问题时 - 是的,我相信根据你提供的描述,你正在考虑的方法会减少开销,这可能会显着减少CPU当前轮询视图的密集程度。