2016-05-12 10 views
0

ノードを使用してレート制限されたAPIからデータを取得します。 APIには、1日あたりおよび1ヶ月あたりの制限があります。その分/ 1日に許可されているAPIコールの数が、既に使用されているコードが分かっているアルゴリズムを見つけるのが難しいです。ノードを使用してレート制限付きAPIからデータを取得する

私はに私のロジックをしたいと思います:APIが制限

ヘルプに近い場合

  • スイッチキー:

    • レート制限GETリクエスト(Rate limit GET requests潜在的な答えはここにあります) !

      var unirest = require('unirest'); 
      var csv = require('fast-csv'); 
      
      keys = ['1a2a3a','2b1b2f'] 
      
      function readData(a, b, key, cb) { 
      
          var url = 'http://json.infoprovider.com/data.json?' 
          + 'a=' + a 
          + '&b=' + b 
          + '&key=' + key 
      
          unirest.get(url).end(function (response) { 
          cb(response.body); 
          }) 
      } 
      
      csv 
      .fromPath("data.csv", { headers: true }) 
      .on("data", function (data) { 
      
          readData(data.a, data.b, key[0], function (r) { 
           console.log("a: " + data.a + ", lng: " + data.b + ", result: " + (JSON.stringify(r))); 
           console.log("API consumed: " & r.UsedThisDay) 
          }) 
      }) 
      
  • +2

    *「コードがその分/日に許可されているAPIコールの数を知るアルゴリズムを見つけるのが難しい」*アルゴリズムですか?その分/ 1日だけカウンターを増やしてみませんか? –

    答えて

    0

    あなたは彼らの例からnode-rate-limiter

    を使用することができます:

    var RateLimiter = require('limiter').RateLimiter; 
    var limiter = new RateLimiter(1, 250); 
    
    
    limiter.removeTokens(1, function() { 
        callMyMessageSendingFunction(...); 
    }); 
    

    ただ、そこにカウンターを追加し、関連付けることを

    私の(擬似)コードは次のようになりますあなたは自分でレートを制限する方法があります。と同様には1日のリクエストを制限します。

    var RateLimiter = require('limiter').RateLimiter; 
    var limiter = new RateLimiter(1, 250); 
    var requestsToday = 0; // Gets reset on each "new" day 
    var requestsLimitPerDay = 200; 
    
    limiter.removeTokens(1, function() { 
        callMyMessageSendingFunction(...); 
    }); 
    
    function callMyMessageSendingFunction() { 
        requestsToday++; 
        if (requestsToday < requestsLimitPerDay) { 
         makeAPICall(); 
        } 
    } 
    

    それは一日あたりの制限がある場合、それはおそらく同様に秒/分あたりの制限があるので、私は、両方の示唆。私の経験では。あなたの要求を全面的に抑制する方が良いでしょう。大規模なサーバー上で実行されているマルチコアNodejsアプリケーションは、Webリクエスト後に同時のWebリクエストを無視してWebサービスを怒らせる確かな方法です。


    あなたのAPIはほぼ限り迅速にコールバックを取得するつもりはないが、あなたはまた、一日あたりの要求の上限を計算し、そして24時間の同じの上にRateLimiter(1, x)引数としてことを使用するオプションがあります。

    +0

    ありがとうございます - それはうまくいくかもしれませんが、私はどのように外部のCSVファイル(ファイルの読み込みが非同期です)を読むロジックでこの作業を行いますか?私の "MessageSending"関数は、csvの次の行を読み込まなければなりません。 –

    +0

    これは、Node.jsでのファイルの読み込みに関する本当のもう一つの質問です。 [それはノードに組み込まれている](https://nodejs.org/dist/latest-v4.x/docs/api/fs.html#fs_class_fs_readstream)。また、非同期のような関数を利用して、関数が完了するのを待ってから移動することもできます。これはノードの一般的な問題です。 [Asyncはうまくいく](https://github.com/caolan/async) –

    関連する問題