【问题标题】:Slow third-party APIs clogging Express server缓慢的第三方 API 阻塞 Express 服务器
【发布时间】:2020-06-27 23:00:41
【问题描述】:

我正在为我的后端使用 Node.js + Express 创建一个问答应用程序。前端将问题数据发送给后端,后端再向多个第三方API请求获取答案数据。

问题是,其中一些第三方 API 响应时间过长,因为它们必须进行一些密集的处理和计算。出于这个原因,我已经实现了一个缓存系统,可以为每个不同的问题保存答案数据。不过,每次第一次请求最多可能需要 5 分钟

由于我的后端服务器等待并且在数据到达之前不响应前端(连接保持打开状态),它只能同时处理 6 个请求(这就是我发现的)。这在性能方面是不可接受的。

有什么办法可以解决这个问题?有没有办法不“阻塞”服务器,使其可以为 6 个以上的用户提供服务?
是否有一种设计模式,其中服务器给出初始响应,然后提供完整的数据?
也许,将请求设置为“睡眠”并为新连接打开空间?

【问题讨论】:

  • 你是怎么解决这个问题的?
  • 我创建了一个轮询和缓存机制。当客户端发送第一个请求时,服务器缓存他的请求,将其设置为“待处理”,然后发送待处理状态。然后客户端会每隔几秒发送一次请求,直到它收到带有请求数据或错误的 OK 状态响应。

标签: javascript node.js express design-patterns web-development-server


【解决方案1】:

如果事情编码正确并且不是 CPU 密集型的,只需等待网络响应,您的服务器就可以同时处理数千个请求。这是node.js特别擅长的。

然而,单个浏览器一次只会向同一个端点发送几个请求(它因浏览器而异)(将其他请求排队,直到较早的请求完成)。所以,我的猜测是你正试图从一个浏览器中测试它。这不会测试您真正想要测试的内容,因为浏览器本身正在限制同时请求的数量。 node.js 特别擅长同时处理大量请求。它可以轻松完成数千次。

但是,如果您确实有一个需要长达 5 分钟的操作,那么这甚至可能不适用于来自浏览器的 http 请求,因为浏览器可能会超时一个仍在等待结果的非活动连接。

我能想到几个可能的解决方案:

首先,您可以让第一个 http 请求只是启动进程并让它立即返回一个 ID。然后,客户端可以每 30 秒检查一次,然后在 http 请求中发送 ID,并且您的服务器可以响应它是否具有该 ID 的结果。这将是一个客户端轮询解决方案。

其次,您可以建立从客户端到服务器的 webSocket 或 socket.io 连接。然后,通过该套接字发送消息以启动请求。然后,每当服务器完成其工作时,它就可以通过 webSocket 或 socket.io 连接将结果直接发送到客户端。客户端收到响应后,可以保持 webSocket/socket.io 连接打开以备将来再次使用,也可以关闭它。

【讨论】:

  • 谢谢!这正是我正在寻找的答案。我确信有某种标准方法可以做到这一点,但不确定如何查找它。你的假设也是正确的。我正在使用单个浏览器对其进行测试。再次感谢您的快速回复。
猜你喜欢
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
相关资源
最近更新 更多