2017-09-20 17 views
0

다른 API 끝점을 호출하는 여러 함수가 있으며 제한을 초과하지 않고 최대한 빨리 호출해야합니다 (예 : 초당 20 호출) . 현재의 솔루션은 지연 시간을 가지며 주어진 예제에 대해 50 밀리 초마다 한 번씩 함수를 호출하는 것이지만 가능한 한 빨리 호출하고 속도 제한과 동일하게 호출 간격을 좁히는 것이 아닙니다.Node.js 가능한 한 빨리 한계를 넘지 않는 함수 호출

+2

"누수 버킷"알고리즘과 관련 NPM 패키지를 제공합니다. – jfriend00

답변

0

function-rate-limit 나를 위해 비슷한 문제가 해결되었습니다. 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

당신은 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); 

? 우리는 "이봐, X 작업을 병렬로 실행하라"고 말하고 각 작업이 완료된 후에 "X 작업을 평행하게 실행"과 동일한 대기열에 다시 넣습니다.