如何跨文件限制API请求的速率? [nodejs]

时间:2019-01-21 15:50:51

标签: node.js rate-limiting

我正在尝试使用bottleneck module,但是此问题适用于任何速率限制模块。

您可以像这样创建一个限制器

const limiter = new Bottleneck({
  minTime: 333
});

但是如果我需要在多个文件中使用相同的限制器怎么办?我会再次创建限制器还是将其传递?

示例文件:

// Call to limit

module.exports = axios.get('some-endpoint').then(res => return res)

1 个答案:

答案 0 :(得分:1)

这取决于您的用例。

比方说,您正在使用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进行交互的所有模块都会使用该限制器。

(如果您与多个供应商进行交互,那么当然有一个限制器,每个供应商具有不同的设置是很有意义的。)