2

ディスラプターに関して次の質問があります。

  1. 消費者 (イベント プロセッサ) は、EventHandler を実装する Callable または Runnable インターフェースを実装していません。次に、どのように並行して実行できますか。たとえば、このようなダイヤモンド パターンがあるディスラプター実装があります。
     c1
P1 - c2 - c4 - c5
     c3

c1 から c3 までは p1 の後に並行して動作し、C4 と C5 はそれらの後に動作します。

したがって、従来、私はこのようなものを持っていました(P1とC1-C5が実行可能/呼び出し可能である)

p1.start();
p1.join();

c1.start();
c2.start();
c3.start();
c1.join();
c2.join();
c3.join();

c4.start();
c4.join();
c5.start();
c5.join();

しかし、ディスラプターの場合、どのイベント ハンドラーも Runnable または Callable を実装していません。

次のシナリオを考えてみましょう:

私のコンシューマ C2 は、イベントへの注釈のために Web サービス呼び出しを行う必要があります。SEDA では、そのような 10 個の C2 要求に対して 10 個のスレッドを起動できます [キューからメッセージを引き出す + Web サービス呼び出しを行い、次の SEDA キューを更新する]。この場合、単一のインスタンスであるイベント プロセッサ C2 (if) が 10 個の C2 リクエストを順番に待機します。

4

2 に答える 2

5

EventHandler は、Runnable である BatchEventProcessor のインスタンスに構成されます。

  • BatchEventProcessor は run() ループを実装します。
  • これは、更新されたイベント シーケンス番号をリング バッファーからフェッチする役割を果たします。
  • イベントが処理可能になると、処理のためにそれらを EventHandler に渡します。

DSL を使用する場合、Disruptor は Executor インスタンスを介してこれらのスレッドを作成します。

  • Disruptor コンストラクターで Executor を提供します。
  • DSL で and/then/etc を使用して EventHandler のリストを提供します。
  • 次に、Disruptor の start() メソッドを呼び出します。start() メソッドの一部として、各 EventProcessor (Runnable) が Executor に送信されます。
  • Executor は、スレッド上で EventProcessor/EventHandler を起動します。

特定のシナリオ (つまり、実行時間の長いイベント ハンドラー) に関しては、次の質問を参照してください。

于 2013-06-10T12:21:04.917 に答える