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

标签 javascript websocket

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

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

编辑

该应用程序是使用 PHP 编写的 Laravel framework并在一组 Docker 容器上运行,使用 Apache 作为 Web 服务器,使用 ratchet库来实现 websockets 的服务器端。从 PHP 更改为 Node 之类的其他实现是不切实际的,但更改 Web 服务器是可能的。

最佳答案

我已经实现了许多推送(websocket)和轮询机制(HTTP),根据我的经验,如果有多个客户端计算机都连续轮询服务器以获取状态更新,并且您将其切换,以便服务器改为触发当发生这种情况时向每个客户端更新状态有许多潜在的好处:

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

确保您使用的网络服务器旨在处理 websocket(一般是长连接),我的经验是使用 Tornado,它是非阻塞的并且非常适合,但许多网络服务器都可以或可以配置为。

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

关于javascript - 如果我从 Javascript 轮询切换到 websockets,会减少服务器负载吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30469922/

相关文章:

JavaScript 单纯形/柏林噪声

javascript - AngularJS $apply 在输入类型范围上的 ngChange 之后不起作用

javascript - 如何在项目中使用 index.js?

javascript - 使用 socket.io 进行服务器端验证

java - 与 Java 服务器和 Javascript 客户端建立 WebSocket 连接

tomcat - tomcat 是否支持安全的 websockets?

javascript - 在 typescript 中过度使用 'this'

c# - 使用 invokescript 将 bool 值从 javascript 传递到 C#

sockets - node.js/socket.io 是否有最大消息/事件大小

javascript - 将数组从 websocket 发送到客户端