运行1000个请求,以便一次仅运行10个

使用node.js时,我希望以http.get每次仅运行10个(或n个)的方式访问多个远程URL。

如果本地发生异常(m次),我也想重试一个请求,但是当状态代码返回错误(5XX,4XX等)时,该请求将视为有效。

这对我来说真的很难缠住我的头。

问题:

  1. 无法尝试捕获http.get,因为它是异步的。
  2. 需要一种在失败时重试请求的方法。
  3. 我需要某种信号量来跟踪当前活动的请求计数。
  4. 当所有请求完成时,我想在列表中获取所有请求url和响应状态代码的列表,并对其进行排序/分组/操作,因此我需要等待所有请求完成。

对于每个异步问题,似乎都建议使用Promise,但是最终我嵌套了太多的Promise,很快它就变得无法使用。

回答:

有很多方法可以处理一次运行的10个请求。

  1. -将异步库与.parallelLimit() 方法一起使用,您可以在其中指定要一次运行的请求数。

  2. -使用 库和该request库将您的http.get()东西包装成可以返回 东西,然后将Promise.map()并发选项设置为10

  3. - 您的请求以启动10个请求,然后每次完成一个请求,再启动另一个请求。

在所有情况下,您都必须手动编写一些重试代码,并且与所有重试代码一样,您将必须非常仔细地确定重试错误的类型,重试错误的时间,重试尝试之间的间隔以及何时重试。最终放弃(您未指定的所有内容)。

我首选的方法是使用Bluebird和promises。依次包括重试和结果收集,可能看起来像这样:

const request = require('request');

const Promise = require('bluebird');

const get = Promise.promisify(request.get);

let remoteUrls = [...]; // large array of URLs

const maxRetryCnt = 3;

const retryDelay = 500;

Promise.map(remoteUrls, function(url) {

let retryCnt = 0;

function run() {

return get(url).then(function(result) {

// do whatever you want with the result here

return result;

}).catch(function(err) {

// decide what your retry strategy is here

// catch all errors here so other URLs continue to execute

if (err is of retry type && retryCnt < maxRetryCnt) {

++retryCnt;

// try again after a short delay

// chain onto previous promise so Promise.map() is still

// respecting our concurrency value

return Promise.delay(retryDelay).then(run);

}

// make value be null if no retries succeeded

return null;

});

}

return run();

}, {concurrency: 10}).then(function(allResults) {

// everything done here and allResults contains results with null for err URLs

});

以上是 运行1000个请求,以便一次仅运行10个 的全部内容, 来源链接: utcz.com/qa/409606.html

回到顶部