我有一个 NodeJS 应用程序,它从代码中的各个位置发送 HTTP 获取请求,有些甚至是依赖的(发送请求,等待回复,处理它并根据结果发送另一个请求)。我需要限制请求的速率(例如,每小时 10 个请求)。
我考虑过将请求排队,然后在某个中心点以受控方式释放它们,但在如何对回调函数及其相关参数进行排队时陷入困境。
很高兴听到有关如何以最少的应用程序重组来克服这种情况的建议。
谢谢
我有一个 NodeJS 应用程序,它从代码中的各个位置发送 HTTP 获取请求,有些甚至是依赖的(发送请求,等待回复,处理它并根据结果发送另一个请求)。我需要限制请求的速率(例如,每小时 10 个请求)。
我考虑过将请求排队,然后在某个中心点以受控方式释放它们,但在如何对回调函数及其相关参数进行排队时陷入困境。
很高兴听到有关如何以最少的应用程序重组来克服这种情况的建议。
谢谢
我想你已经回答了你的问题。可以限制您的请求的中央队列是要走的路。这里唯一的问题是队列必须具有请求的完整信息和应该使用的回调。我会将其抽象为一个QueueableRequest
看起来像这样的对象:
var QueueableRequest = function(url, params, httpMethod, success, failure){
this.url = url;
this.params = params;
...
}
//Then you can queue your request with
queue.add(new QueueableRequest({
"api.test.com",
{"test": 1},
"GET",
function(data){ console.log('success');},
function(err){ console.log('error');}
}));
当然,这只是示例代码,可能会更漂亮,但我希望你能明白。
Async模块有许多可以帮助您的控制流选项。queue
听起来很合适,您可以在其中限制并发性。
我会使用Deferreds并为每个排队的请求返回一个。然后,您可以在延迟承诺排队后将成功/失败回调添加到延迟承诺。
var deferred = queue.add('http://example.com/something');
deferred.fail(function(error) { /* handle failure */ });
deferred.done(function(response) { /* handle response */ });
[ url, deferred ]
您可以在队列中保留一对,并且每次将 URL 出列时,您还将拥有与之配套的 Deferred,您可以在处理请求后解决或失败。