2012-01-03 4 views
5

ネットでは良いスロットルアルゴリズムを実装したいのですが(C#またはVB)、どうすればいいのか分かりません。.NETスロットルアルゴリズム

ケースは私のasp.netウェブサイトは結果をフェッチするために別のウェブサイトにリクエストを送信する必要があります。 1分あたり最大300件のリクエストを送信する必要があります。

リクエストが300制限を超えた場合、他のパーティのApiは何も返しません(これは私のコードでチェックとして使用したくないものです)。

P.S.クラスIは、.NET以外の言語でのソリューションを見てきましたが、私は初心者ですし、親切にしてください、あなたは簡単なアプリケーション(またはセッション)を持つことができ、あなたに

+1

[抑制する非同期タスク]の複製(http://stackoverflow.com/questions/22492383/throttling-asynchronous-tasks) –

答えて

5

ありがとう

123のような単純な回答を保ち、ヒットを確認してください。これは非常にラフな何かがちょうどあなたのアイデアを与えることです:

public class APIHits { 
    public int hits { get; private set; } 
    private DateTime minute = DateTime.Now(); 

    public bool AddHit() 
    { 
     if (hits < 300) { 
      hits++; 
      return true; 
     } 
     else 
     { 
      if (DateTime.Now() > minute.AddSeconds(60)) 
      { 
       //60 seconds later 
       minute = DateTime.Now(); 
       hits = 1; 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 
} 
2

最も簡単な方法は、ちょうどそれがパケット間で、それらが複数の0.2秒ごとのレートで送信することができませどのくらいの時間があります。つまり、呼び出されたときと、次に呼び出されるときを記録し、少なくとも200msが逸失していることを確認するか、何も返しません。

このアプローチは機能しますが、スムーズなパケットフローの場合にのみ機能します.1分間の平均値が300を超えない限り、200ms間隔で5つのメッセージを許可したい場合がありますコール。この場合、値の配列を使用して最後の300パケットの「タイムスタンプ」を保存し、次にyoiuがコールを受信するたびに「300コール前」に戻って少なくとも1分経過したことを確認できます。

両方のスキームでは、正確な約15ミリ秒であるため、Environment.TickCountによって返される時間値は、(200ミリ秒以上の)ニーズに適しています。