使用Request -promise限制Node.js API的请求
Node.js API Request limit with request-promise
我正试图从我的node.js应用程序命中REST API端点,如下所示:
var people = [];
for(var i=0; i<n; i++) {
//create person
people.push(person);
}
return Promise.all(people.map(create3APIRequestPromises));
其中create3APIRequestPromises近似如下:
// APIRequestPromise = require('request-promise')(options);
return Promise.all([APIRequestPromise1, APIRequestPromise2, APIRequestPromise3]);
代码对少数人都能正常工作,但如果我增加太多,它就会开始失败。我认为这个失败是由于提供REST API的服务限制了我的使用。所以,我的问题是,什么是最好的方法来限制我发送请求的数量,比如说,每秒10个。
我读过node-rate-limiter,但我看不出它是如何与我上面使用'request-promise'写的承诺相匹配的(也许这个模块是不可能的,所以也许你可以建议一个替代方案)。
谢谢。
我认为在你的情况下,最好在请求之间使用简单的时间填充。要做到这一点,您应该将请求分成一系列,并在每组之前添加延迟。我意识到一个例子。用法是:
// Create timepad function
let timePad = createTimePad(5, 10e3); // 5 requests each 10 seconds
// Iterate over people
return Promise.all(
people.map(
(human) => timePad().then(() => create3APIRequestPromises(human))
)
);
创建时间垫的功能:
// Create timepad function where timeout is timeout between calls and series is the maximum
// number of calls that will be done simultaneously
function createTimePad(series = 10, timeout = 1000) {
let seriesCounter = series;
let delay = timeout;
return () => {
return new Promise((resolve) => {
if (seriesCounter < 1) {
delay += timeout;
seriesCounter = series;
}
setTimeout(resolve, delay);
seriesCounter -= 1;
});
};
}
这很简单,可以根据你的愿望将请求分成不同大小的组
这个问题问得好。我也有同样的问题,意识到还没有人解决,于是开始实行配额。它已经涵盖了你的用例。
像这样创建你的经理:
var quota = require('quota');
var manager = new quota.Manager({
backoff: 'timeout'
});
// 10 new requests per second
manager.addRule({
name: 'main',
limit: 10,
window: 1000,
throttling: 'window-sliding',
queueing: 'fifo',
resource: 'requests'
});
var quotaServer = new quota.Server();
quotaServer.addManager('custom', manager);
var quotaClient = new quota.Client(quotaServer);
然后通过这个包装器调用每个请求:
var request = require('request-promise');
function requestThrottled(options) {
var _grant;
return quotaClient.requestQuota('custom', {}, { requests: 1 }, {
maxWait: 60000 // Each request will be queued for 60 seconds and discarded if it didn't get a slot to be executed until then
})
.then(function (grant) {
_grant = grant;
return request(options);
})
.finally(function () {
if (_grant) {
_grant.dismiss();
}
});
}
你可以像以前一样提出请求:
Promise.all([
requestThrottled(optionsRequest1),
requestThrottled(optionsRequest2),
requestThrottled(optionsRequest3)
])
相关文章:
- 跨节点服务器上的多个 API 请求维护数据
- 在 Google 云端硬盘 API 请求中使用参数
- Angularjs的异步API请求
- 如何将头添加到ActiveResource以创建API请求
- Flux+Rreact.js-缓存API请求响应
- JavaScript中的Google Drive API请求
- API请求在使用phonegap调试时不工作,但在模拟器中工作,为什么
- 使用Jquery将JSON API请求的元素传递给数组
- 如何将访问令牌用于Facebook Opengraph javascript SDK api请求
- 从多个API请求推送到全局数组
- 确定 API 请求的来源
- 如何将 API 请求中的 JSON 获取到页面的 javascript 中
- 跟踪 Google 可视化 API 请求中的事件
- 为什么此 Google 日历 API 请求不返回开始时间等事件数据
- 取消以前由 ng-change 创建的 api 请求
- 来自 HTML/js 项目中的 .dll / .aspx 文件的 API 请求
- GiantBomb API 请求获取 HTML 而不是 JSON,Nodejs 请求模块
- 在 Angular JS 服务中调用 YouTube API 请求
- 如何限制 api 请求堆栈
- Javascript:具有多个查询参数的嵌套 JSON api 请求