Node.js设计方法定期从客户端轮询服务器

问题描述

我正在尝试学习Node.js和适当的设计方法。

我已经实现了一个小型的API服务器(使用 express ),该服务器根据使用该API的客户端请求从多个远程站点获取一组数据。

此过程可能需要一些时间(几个 fecth / 等待 ),所以我希望用户知道他的要求怎么样。我已经读过有关 socket.io / websockets 的信息,但是对于这种情况,这也许是一个过大的解决方案。 / p>

所以我做的是:

  • 对于每个客户请求,都会生成一个 requestID 并返回给客户。
  • 使用该ID,客户端可以随时(通过另一个端点)查询API以了解其请求状态。
  • 使用客户端页面上的 setTimeout()和一些 DOM操作,我可以每隔 X 更新和显示当前请求状态,例如 轮询 方法。

尽管该解决方案运行良好,即使有多个客户端同时连接,也许还有更好的解决方案?我有没有考虑的警告事项?

解决方法

TL; DR 您正在使用的方法很好,尽管可能无法很好地扩展。 Websocket是解决相同问题的另一种方法,但同样,扩展性可能不太好。

您已经确定了网站上实时(或接近它)实时更新的唯一两个基本选择:

  1. 轮询服务器-客户端定期请求信息
  2. 使用Websockets-服务器可以在发生事件时将更新推送到客户端

有几件事要考虑。

  1. “实时”更新有多重要?如果用户可以等待几秒钟(或更长时间),则可以进行轮询。
  2. 服务器可以处理哪种负载?如果需要考虑负载,那么Websockets可能是可行的方法。

最后一个问题确实是问题的症结所在。如果您期望几个或几十个客户端使用此功能,则两种解决方案都可以正常工作。

如果您期望连接成千上万的服务器,那么轮询就成为一个问题,因为现在我们正在谈论对服务器的许多重复请求。当然,如果间隔较长,则负载会较低。

据我了解,Websockets的开销较低,但是在谈论大量客户端时仍然是一个令人担忧的问题。同样,大量的客户端意味着服务器正在管理大量的开放连接。

大型服务处理此问题的方式是设计应用程序,使它们可以分布在许多相同的服务器上,并且您连接到的服务器由负载均衡器管理。无论是轮询还是Websocket,都是如此。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...