私のシステムは、整数のイベントを生成します。合計で、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 回の比較操作にすぎません。
もっと良いものをお勧めできますか?