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

时间:2015-05-26 22:19:50

标签: javascript websocket

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

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

修改

应用程序使用Laravel framework以PHP编写,并在一组Docker容器上运行,Apache使用ratchet库作为Web服务器来实现websockets的服务器端。从PHP更改为另一个类似节点的实现是不切实际的,但可以更改Web服务器。

1 个答案:

答案 0 :(得分:2)

我已经实现了一些推送(websocket)和轮询机制(HTTP),根据我的经验,如果有多个客户端计算机都连续轮询服务器以进行状态更新并且你切换它以便服务器反而激活状态更新到每个客户端时,有一些潜在的好处:

  1. 数据仅在初始连接时发送给客户端,随后在发生更新时发送(因此不太常见)。没有请求检查尚未发生的更新。
  2. 服务器只需执行工作以在新客户端连接或后续更新时生成响应(尽管缓存也可以解决此问题)。
  3. 根据我编写websocket和HTTP API的经验,websocket效率更高,因为连接和授权每个请求没有开销,只有第一个连接有这个开销,之后数据可以通过同一个连接(两个方向)发送需要连接并重新授权客户端(例如密钥,用户名和密码 - 如果需要的话)。
  4. 确保您使用的是设计用于处理websocket的Web服务器(一般来说是长连接),我的经验是Tornado,它是非阻塞的,非常适合,但许多Web服务器都可以配置或者可以配置。< / p>

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