问题描述
我正在尝试学习Node.js和适当的设计方法。
我已经实现了一个小型的API服务器(使用 express ),该服务器根据使用该API的客户端请求从多个远程站点获取一组数据。
此过程可能需要一些时间(几个 fecth / 等待 ),所以我希望用户知道他的要求怎么样。我已经读过有关 socket.io / websockets 的信息,但是对于这种情况,这也许是一个过大的解决方案。 / p>
所以我做的是:
- 对于每个客户请求,都会生成一个 requestID 并返回给客户。
- 使用该ID,客户端可以随时(通过另一个端点)查询API以了解其请求状态。
- 使用客户端页面上的 setTimeout()和一些 DOM操作,我可以每隔 X 更新和显示当前请求状态,例如 轮询 方法。
尽管该解决方案运行良好,即使有多个客户端同时连接,也许还有更好的解决方案?我有没有考虑的警告事项?
解决方法
TL; DR 您正在使用的方法很好,尽管可能无法很好地扩展。 Websocket是解决相同问题的另一种方法,但同样,扩展性可能不太好。
您已经确定了网站上实时(或接近它)实时更新的唯一两个基本选择:
- 轮询服务器-客户端定期请求信息
- 使用Websockets-服务器可以在发生事件时将更新推送到客户端
有几件事要考虑。
- “实时”更新有多重要?如果用户可以等待几秒钟(或更长时间),则可以进行轮询。
- 服务器可以处理哪种负载?如果需要考虑负载,那么Websockets可能是可行的方法。
最后一个问题确实是问题的症结所在。如果您期望几个或几十个客户端使用此功能,则两种解决方案都可以正常工作。
如果您期望连接成千上万的服务器,那么轮询就成为一个问题,因为现在我们正在谈论对服务器的许多重复请求。当然,如果间隔较长,则负载会较低。
据我了解,Websockets的开销较低,但是在谈论大量客户端时仍然是一个令人担忧的问题。同样,大量的客户端意味着服务器正在管理大量的开放连接。
大型服务处理此问题的方式是设计应用程序,使它们可以分布在许多相同的服务器上,并且您连接到的服务器由负载均衡器管理。无论是轮询还是Websocket,都是如此。