Node.js尽可能快地调用函数而不超过某些限制

时间:2017-09-20 22:37:41

标签: node.js api throttling rate-limiting

我有多个函数调用不同的api端点,我需要尽快调用它们而不超过某些限制(例如每秒20次调用)。我目前的解决方案是延迟并按照我给出的示例每隔50毫秒调用一次该函数,但我想尽快调用它们,而不是仅仅使用速率限制来平均调用它们。

2 个答案:

答案 0 :(得分:0)

function-rate-limit为我解决了类似的问题。函数速率限制会随着时间的推移扩展对函数的调用,而不会调用对函数的调用。在达到速率限制之前,它仍允许对您进行即时调用,因此它可以在正常情况下无延迟地运行。

功能速率限制文档的示例:

var rateLimit = require('function-rate-limit');

// limit to 2 executions per 1000ms 
var start = Date.now()
var fn = rateLimit(2, 1000, function (x) {
  console.log('%s ms - %s', Date.now() - start, x);
});

for (var y = 0; y < 10; y++) {
  fn(y);
}

结果:

10 ms - 0
11 ms - 1
1004 ms - 2
1012 ms - 3
2008 ms - 4
2013 ms - 5
3010 ms - 6
3014 ms - 7
4017 ms - 8
4017 ms - 9

答案 1 :(得分:-1)

您可以尝试使用async中的队列。这样做时要小心,它在其他语言中的行为基本上类似于while(true)

const async = require('async');

const concurrent = 10; // At most 10 concurrent ops;
const tasks = Array(concurrent).fill().map((e, i) => i);

let pushBack; // let's create a ref to a lambda function

const myAsyncFunction = (task) => {
  // TODO: Swap with the actual implementation
  return Promise.resolve(task);
};

const q = async.queue((task, cb) => {
  myAsyncFunction(task)
    .then((result) => {
      pushBack(task);
      cb(null, result);
    })
    .catch((err) => cb(err, null));
}, tasks.length);

pushBack = (task) => q.push(task);
q.push(tasks);

这里发生了什么?我们说&#34;他们并行运行X任务&#34;并且在每个任务完成之后,我们将其放回队列中,这相当于说&#34;永远并行运行X任务&#34;