EventHandler の 1 つが壊れたときに、CPU 使用率が高い状況に陥りました。
EventHanlders
バッファーを介して順次実行するように構成された複数のコンシューマー ( ) があるとします。最初の EventHandler が例外をスローした場合、他のすべての EventHandler を停止する (そして後で起こす) 方法はありますか?
私たちが行っていることは、失敗したスレッドをスリープ状態にしてから、同じイベントを再度消費しようとすることです。RingBuffer
しかし、他のスレッドが引き続き実行され、読み取るイベントがない場合でも読み取りを試行し、CPU が許容レベルよりも低下していることに気付きました。
通常の条件下では期待どおりに動作するためWaitStrategy
、これが原因で発生していることを今のところ破棄します。disruptor
を使用してBlockingWaitStrategy
おります。
例のためにいくつかの説明
INPUT -> [A*] -> [B] -> [C] -> [D]
ここで、INPUT は からポーリングされたイベントでRingBuffer
、A、B、C、および D は順次実行されるさまざまな EventHandler です。A* は、例外をスローする消費者です。
私たちが達成したいことは、コンシューマ A がイベントを消費できない場合 (例: 例外が発生した後)、そのコンシューマの OnEvent(...) メソッドは終了せず、再び消費を試みる通常のスリープでループにとどまることです。起きたら同じイベント。その間、他のすべてのコンシューマーは、A が成功するまでパークまたはスリープ状態にする必要があります。
ディスラプター バージョン 3.3.0 を使用しています。
私はグーグルで検索しましたが、有効な解決策が見つかりませんでした。
前もって感謝します。
サルバ。