5

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

ケースは私のasp.netウェブサイトが結果を取得するために別のウェブサイトに要求を掲示するべきであるということです。 1分あたり最大300のリクエストを送信する必要があります。

要求が300の制限を超えると、相手のApiは何も返しません(これは私が自分のコードのチェックとして使用したくないものです)。

P.S私は.net以外の言語で解決策を見たことがありますが、私は初心者なので、親切にしてあなたの答えを123のように単純にしてください。

ありがとうございました


2 답변


6

単純なアプリケーション(またはセッション)クラスを用意して、ヒットがないか確認してください。これはあなたにアイデアを与えるためだけに非常に荒いものです:

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コールを超えない限り、200ミリ秒の間に5メッセージを許可します。この場合、最後の300パケットの「タイムスタンプ」を格納するために値の配列を使用することができます。そしてあなたが電話を受けるたびに少なくとも1分が経過したことを確認するために「300電話前」に振り返ることができます。

これらのスキームの両方に対して、によって返される時間値はEnvironment.TickCountそれは約15ミリ秒に正確であるように、あなたのニーズ(200ミリ秒以上のスパン)には十分でしょう。

リンクされた質問


関連する質問

最近の質問