您如何限制 API 跨文件的请求? [节点]
How do you rate-limit API requests across files? [nodejs]
我正在尝试使用 bottleneck module 但这个问题适用于任何速率限制模块。
您可以像这样创建一个限制器
const limiter = new Bottleneck({
minTime: 333
});
但是如果我需要在多个文件中使用相同的限制器怎么办?我会再次创建限制器还是传递它?
示例文件:
// Call to limit
module.exports = axios.get('some-endpoint').then(res => return res)
这取决于您的用例。
假设您正在使用 limiter
来限制您对某些第三方 API 的请求,并且您希望确保每秒只发出 3 个请求,并且您从多个请求中发出请求模块。在这种情况下,是的,您需要传递该限制器并在多个模块中使用它。
在这种情况下更好的设计是确保 只有一个模块 调用 API,并且那个模块有限制器。例如:
// api.js
const limiter = new Bottleneck({
minTime: 333
});
module.exports = {
makeRequest: limiter.wrap(options => {
// interact with API and return response
});
};
然后,您的每个其他模块都只使用您的内部 API:
// some-other-module.js
const api = require('./api');
module.exports = {
createCustomer: (options) => {
return api.makeRequest({ ... });
}
};
这样,限制器只存在于您应用程序的一个位置,但会被所有与之交互的模块使用 API。
(如果您与多个供应商互动,那么当然,每个供应商使用不同设置的不同限制器是有意义的。)
我正在尝试使用 bottleneck module 但这个问题适用于任何速率限制模块。
您可以像这样创建一个限制器
const limiter = new Bottleneck({
minTime: 333
});
但是如果我需要在多个文件中使用相同的限制器怎么办?我会再次创建限制器还是传递它?
示例文件:
// Call to limit
module.exports = axios.get('some-endpoint').then(res => return res)
这取决于您的用例。
假设您正在使用 limiter
来限制您对某些第三方 API 的请求,并且您希望确保每秒只发出 3 个请求,并且您从多个请求中发出请求模块。在这种情况下,是的,您需要传递该限制器并在多个模块中使用它。
在这种情况下更好的设计是确保 只有一个模块 调用 API,并且那个模块有限制器。例如:
// api.js
const limiter = new Bottleneck({
minTime: 333
});
module.exports = {
makeRequest: limiter.wrap(options => {
// interact with API and return response
});
};
然后,您的每个其他模块都只使用您的内部 API:
// some-other-module.js
const api = require('./api');
module.exports = {
createCustomer: (options) => {
return api.makeRequest({ ... });
}
};
这样,限制器只存在于您应用程序的一个位置,但会被所有与之交互的模块使用 API。
(如果您与多个供应商互动,那么当然,每个供应商使用不同设置的不同限制器是有意义的。)