0

私のシステムは、整数のイベントを生成します。合計で、1 から 10 000 までの約 10 000 のイベントがあります。numer で新しいイベントを受信するたびに、最後の 1 秒間にそのような番号でイベントを何回受信したかを確認する必要があります。

  • 過去 1 秒間にこのイベントを 3 ~ 10 回以上受信した場合は、無視する必要があります
  • そうでなければ、私はそれを処理する必要があります。

したがって、同じ番号のイベントで「洪水」を制御して無視するだけです。

次の 2 つの要件があります。

  • フラッド コントロールのオーバーヘッドは、HFT 取引で使用されるため、最小限に抑える必要があります。
  • 同時に、「正確に」制御する必要はありません。「大まかに」フラッド制御が必要なだけです。つまり、毎秒 3 ~ 10 イベントのどこかでイベントの受信を停止しても問題ありません。

したがって、私の提案は次のようになります。

  • int[10 000] 配列を作成
  • 毎秒、この配列内のすべての項目を 0 に更新します (配列の項目の更新操作はアトミックです。また、項目を挿入または削除しないため、問題なくロックせずに配列を反復処理できますが、おそらく誰かが特別な関数を推奨することができます「ゼロ」配列、別のスレッドから同時に配列を読み取ることができることを考慮してください)
  • 新しいイベントが受信されるたびInterlocked.Incrementに、配列内の対応する項目が処理され、結果がしきい値 (~3) 未満の場合にのみ処理されます。

したがって、フラッド コントロールは 1 回のIntrerlocked.Increment操作と 1 回の比較操作にすぎません。

もっと良いものをお勧めできますか?

4

1 に答える 1

1

あなたのアプローチの問題の1つは、カウンターを毎秒クリアすると、秒の終わりの直前にフラッドが発生した可能性がありますが、クリアしたばかりなので、新しいイベントを受け入れ続けることです。
近似のみが得意なので、問題ないかもしれません。

別のアプローチは、タイムスタンプのキューの配列を持つことです。新しいイベントが発生すると、配列から関連するキューを取得し、その先頭から 1 秒以上前に発生したすべてのタイムスタンプをクリアします。
キューのサイズを確認し、しきい値よりも大きい場合は何もしません。それ以外の場合は、新しいイベントのタイムスタンプをキューに入力して処理します。
このアプローチは、整数をインクリメントするよりも遅くなる可能性がありますが、より正確になることは承知しています。

いくつかのベンチマークを実行して、どれだけ遅いか、ニーズに合っているかどうかを確認できると思います。

于 2012-12-23T16:23:49.640 に答える