5

IOを実行するメソッドがあり、バックエンドが処理できない同時リクエストのバーストを取得しないように、呼び出し(1秒あたり)をこのメソッドに制限したいと思います。

要件が「1秒あたり」なしで発生した場合は、スタック(基本的にはカウンターのみ)を使用しoffer()、要求を開始するとき、および完了しpoll()たときに使用できます。「1秒あたり」の要件では、特定の時間の経過よりも古いスタック上のスロットをどうにかしてクリーンアップする必要があります。

どうすればそれを正しく行うことができますか?明らかに、構造はスレッドセーフである必要があります。

お時間をいただきありがとうございます!

4

3 に答える 3

4

この質問を見てください。質問の言い回しがかなり異なっていても、答えはこの問題にも同様に当てはまります。

告白します、少し不思議ですが、美しく機能します。

于 2011-05-18T16:26:08.473 に答える
3

キューを使用することもできますが、いくつかの変更が加えられています。キューに追加する(メソッドが呼び出される)ときはいつでも、キューに含まれる要素の数とそれらがいつ追加されたかを確認します。1秒以上前に挿入されたすべての要素を削除できます。残りの要素の数を1秒あたりの速度と比較すると、メソッドの実行を拒否するかどうかを決定できます。拒否する代わりにメソッドブロックを使用する場合は、少し複雑になる可能性があります。

多くの可能な実装が存在する可能性があり、それらが問題に対して実行可能かどうかを確認する必要があります。また、問題の一般的な概念であるトークンバケットの実装を確認することもできます。

于 2011-05-18T09:36:22.820 に答える
0

IO作業を要求元のスレッドから切り離し、代わりに特定のサイズのスレッドのプールにオフロードする必要があるようです。このようにして、同時にIOを実行するスレッドの数を明示的に制御できます。

ExecutorService pool = Executors.newFixedThreadPool(10);

public void myMethod() {

  pool.submit(new Runnable() {
    public void run() {
      //Do IO work here
    }
  });

}

この例では、IO作業を実行するスレッドが10を超えることはありません。1秒あたりのリクエスト数を制限するのではなく、同時実行性を制御することは、おそらくスロットルのより良い方法です。

于 2011-05-18T09:57:55.483 に答える