【问题标题】:Rate limit GET requests速率限制 GET 请求
【发布时间】:2016-01-08 00:36:06
【问题描述】:

我有一个外部 API,它将 API 请求的速率限制为每秒最多 25 个请求。我想将部分结果插入到 MongoDB 数据库中。

如何对请求函数进行速率限制,以免错过所有数组的任何 API 结果?

MongoClient.connect('mongodb://127.0.0.1:27017/test', function (err, db) {
    if (err) {
        throw err;
    } else {
        for (var i = 0; i < arr.length; i++) {
            //need to rate limit the following function, without missing any value in the arr array
            request( {
                method: 'GET',
                url: 'https://SOME_API/json?address='+arr[i]
            },
            function (error, response, body) {
                //doing computation, including inserting to mongo
            }
            )
        };
    }
});

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    这可以使用request-rate-limiter 包来完成。因此,您可以将其添加到您的代码中:

    var RateLimiter = require('request-rate-limiter');
    const REQS_PER_MIN = 25 * 60; // that's 25 per second
    var limiter = new RateLimiter(REQS_PER_MIN);
    

    由于request-rate-limiter 是基于request,您可以将request 替换为limiter.request

    您可以在包的 npm 页面上找到更多信息 - https://www.npmjs.com/package/request-rate-limiter

    就个人而言 - 我会用承诺替换所有这些回调

    【讨论】:

    • 虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
    【解决方案2】:

    你需要结合两件事。

    • 一种节流机制。我建议来自 lodash 项目的_.throttle。这可以为你做速率限制。
    • 您还需要一个异步控制流机制来确保请求按顺序运行(在第一个完成之前不要启动第二个)。为此我建议async.eachSeries

    如果您将代码重构为此签名,这两项更改都会更简洁:

    function scrape(address, callback) {
       //code to fetch a single address, do computation, and save to mongo here
       //invoke the callback with (error, result) when done
    } 
    

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 2018-07-18
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多