【问题标题】:NodeJS: Do I need to end HTTP requests to save memory/CPU?NodeJS:我是否需要结束 HTTP 请求以节省内存/CPU?
【发布时间】:2016-01-11 22:42:24
【问题描述】:

我用 Node 和 Express 编写了一个程序,使用 Request 连接到 API 并下载大量数据(想想 3,000 个 API 请求)(请注意,都在 API 的使用限制范围内)。

在 Docker 容器中运行它时,我收到很多 getaddrinfo ENOTFOUND 错误,我想知道这是否是资源问题。我的要求是这样的:

request.get(url, function(err, resp, body){
  // do stuff with the body here, 
  // like create an object and handball to a worker function
});

对于前几百个请求,这总是可以正常工作,但随后我收到很多 ENOTFOUND 或超时错误,我认为问题可能是我的代码处理所有这些请求的方式。

我已经将它们分批放入一个超时队列中,因此请求发生的速度相对较慢,它有一点帮助,但并不能完全解决问题。

我是否需要销毁正文/响应对象以释放内存或其他东西?

【问题讨论】:

  • 澄清:您是否立即发送所有请求?您是否考虑过限制并发请求的数量(例如使用异步)
  • 您很可能会遇到您调用的 API 的配置问题
  • @h0ru5 我做了类似的事情,我创建了一个队列数组和一个循环遍历它的脚本,每 5 秒执行 25 次调用。
  • 你确定你没有达到 api 限制吗?这通常是由于目标网络限制您或过载,或者您的服务器/本地网络过载。在 25/5 秒时,这可能不是网络问题,更有可能是限制。
  • @MikeDinescu 可能,但请参阅上面的评论。

标签: javascript node.js node-request


【解决方案1】:

我在使用的 API 中遇到了类似的问题,最终出现了这里的一些建议 - 速率限制。某些 API 不会返回有关速率限制的可读错误,因为它们为每个客户端提供一定数量的资源,并且当您用完所有资源时,它们甚至无法向您发送错误的响应。

即使我每天都保持在发布的速率限制内,但事实证明它们每分钟有一个不成文的限制(或者更像 - 只是无法处理这么多请求)。

我通过用我自己的代码模拟该 API 来回答这个问题,将其放置在网络中以便最大限度地提高相似性,并且由于我的模拟代码没有做任何事情,我在 NodeJS 服务器中从未遇到任何错误。

然后我在需要的时候设置了一些倒计时和超时。

我也建议你。记住他们有每小时限制,并不意味着他们没有不同的每秒/分钟限制。

【讨论】:

    猜你喜欢
    • 2019-05-28
    • 2011-08-05
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2011-08-14
    • 2018-10-09
    相关资源
    最近更新 更多