Handling 25,000 GET requests to an API
因此,基本上,我正在尝试向API发送大量(约25,000个)GET请求。我将axios用作进行HTTP调用的库。
所以我有:
1 | dsHistPromises.push(axios.get(url)) |
然后我正在使用:
1 2 3 4 5 6 7 8 9 10 11 | axios.all(dsHistPromises) .then(function(results) { results.forEach(function(response){ if (format === lists.formats.highlow) { storage.darkskyHistoryHighLow.push(requests.parseDarkskyHighLow(response, city)) } // parse data here and print it to files... }) }).catch(err => { throw err }) |
履行我的所有诺言。
当我尝试运行代码时,出现类似
的错误
1 | (node:10400) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: read ECONNRESET |
我必须想象这是我连接的API的问题。服务器可能很难管理我的请求,对吗?
有什么技巧可以解决这个问题吗?
您怀疑,这是因为您正在访问的API。大多数理智的API都会采取某种限制措施,以防止一个用户将其降低。您可能会遇到这种情况。
您需要做的是通过在两次通话之间设置时间延迟来限制您的消息。
有两种方法可以解决此问题。一种方法是依次进行每个呼叫。这将有助于避免服务器节流,但速度可能会变慢。
如果服务器允许,则可以并行执行多个请求。
基本上,它看起来像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | const urls = getUrlsToCallFromSomewhere(); const delay = 500; // ms const next = () => { if (!urls.length) { return; } const url = urls.pop(); axios.get(url).then(data => { results.push(data); const now = Date.now(); if (now - start > delay) { next(); } else { setTimeout(next, delay - (now - start)); } }); }; |
这不是超级完美,但应该可以给您一个想法。基本上,一次叫他们一个。完成后,请检查已完成多长时间。如果您已经达到
您可以安排代码以同时运行其中的一些代码,以加快处理速度,并根据需要将延迟调整为尽可能长或尽可能快。