我正在抓取API。有很多要求。如果我做了太多请求,API开始看起来很可疑,我得到了一堆503.那没关系,当我得到一个503我在重新运行请求之前设置了一个定时器,并且这个定时器是由对于同一请求的每个503,两个。
但它不起作用。因为我的计时器是异步的。当我得到503时,在启动此计时器之后,Node会立即重新使用套接字来处理挂起的请求。所以我的计时器基本上没有改变任何东西。
我该如何防止这种情况?
到目前为止我尝试过:
settimeout
sync
模块及其pause
(不起作用,因为光纤是异步的有什么想法吗? :其中
答案 0 :(得分:0)
我终于得出结论,此时此刻不可能。
为了防止大规模泛滥,我正在使用queue
模块的async
对象。代码是这样的:
var queue = new Sync.Queue( function ( task, markAsComplete ) {
Http.request( {
agent : false, // we will use our own rate limiter, so we don't need agents
...
}, function ( err, res ) {
res.on( 'end', function ( ) {
if ( IS_503 ) {
var originalConcurrency = queue.concurrency; // saving the original concurrency
queue.concurrency = 1; // our timeout will now stop every request
setTimeout( function ( ) {
queue.concurrency = originalConcurrency; // restoring the concurrency
queue.push( task );
markAsComplete( );
}, 1000 );
}
} );
} );
}, numberOfParallelRequests );