如何在节点中管理大量HTTP请求

时间:2018-04-15 12:52:10

标签: node.js performance http concurrency

一直在网上寻找答案,但没有找到任何结论。

我有一个节点应用程序(可能)需要发出大量的HTTP GET请求。

让我们说http://foo.com/bar允许一个' id'查询参数,我有大量的ID要处理(~1k),即
http://foo.com/bar?id=100
http://foo.com/bar?id=101

人们使用过哪些库可能最适合这项任务?

我想我正在寻找队列和连接池之间的东西:

  1. 设置:

    • 存在大量要处理的ID(最多约1k ID)
  2. 过程:

    • 某种包含X个'工作人员的游泳池'已定义
    • 每个工作人员都会获取一个ID并发出请求(一次运行最多X个并发工人)
    • 当一个worker完成时,它从数组中获取下一个ID并处理
    • 等。直到所有ID都已处理完毕
  3. 欢迎任何经验

1 个答案:

答案 0 :(得分:0)

它实际上比我最初想的要简单得多,而且只需要Bluebird(我在这里解释一下,因为我的最终代码最终变得复杂得多):

var Promise = require('bluebird');
...
var allResults = [];
...
Promise.map(idList, (id) => {
      // For each ID in idList, make a HTTP call
      return http.get( ... url: 'http://foo.com/bar?id=' + id ... )
              .then((httpResposne) => {
                return allResults.push(httpResposne);
              })
              .catch((err) => {
                var errMsg = 'ERROR: [' + err + ']';
                console.log(errMsg + (err.stack ? '\n' + err.stack : ''));

              });
    }, { concurrency: 10 }) // Max of 10 concurrent HTTP calls at once
    .then(() => {
      // All requests are now complete, return all results
      return res.json(allResults);
    });