2017-01-18 2 views
0

https://martinfowler.com/articles/lmax.htmlで説明したように、私はRingBufferのイベントをまずUnmarchalerで処理し、次にBusiness Logic Processorで処理する必要があります。LMAX Disruptor(unmarchalerからビジネスロジックまで)の下位層のコンシューマ間でデータを渡す?

Disruptor<MyEvent> disruptor = new Disruptor<MyEvent>(MyEvent.FACTORY, 32, Executors.newCachedThreadPool()); 
    EventHandler<MyEvent> handler1 = new EventHandler<MyEvent>() { ... }; 
    EventHandler<MyEvent> handler2 = new EventHandler<MyEvent>() { ... }; 
disruptor.handleEventsWith(handler1); 
disruptor.after(handler1).handleEventsWith(handler2); 

https://lmax-exchange.github.io/disruptor/docs/com/lmax/disruptor/dsl/Disruptor.html)それは同じように構成されているとアイデアがhandler1がunmarchalerで、handler2がhandler1によって処理されたものを消費すること、その後です。

Quesion:どのようにして「アンマーキング」と「ディスラプターに戻す」部分を正確にコーディングできますか?私はこのhttps://groups.google.com/forum/#!topic/lmax-disruptor/q6h5HBEBRUkの説明を見つけましたが、私はかなり理解しませんでした。イベントから

非marchalsいくつかのデータ:イベントは、handler1

void onEvent(T event, long sequence, boolean endOfBatch) 

https://lmax-exchange.github.io/disruptor/docs/com/lmax/disruptor/EventHandler.html javadocの)コールバックに到着されているとします。今度は、unmarchaledオブジェクトを扱うhandler2のイベントにunmarchaledデータを追加する必要があります。

「更新」イベントには何が必要ですか? "イベント"オブジェクトを十分に変更していますか?

答えて

1

この影響は実際には特定のシナリオに依存します。また、レイテンシが短い場合は常に両方を試してベンチマークを実行する必要があります。

最も簡単なのは、「イベント」オブジェクトを更新することですが、具体的な方法によっては、この方法で混乱した人の多くのシングルライターのメリットが失われる可能性があります。私はいくつかのオプションを説明し、提供します。

例えば、handler1とhandler2があり、handler1がthread1で実行され、handler2がthread2で実行されているとします。初期イベントパブリッシャはthread0にあります。

  • Thread0 1
  • スレッド1は、スロット1にエントリを読み取り、スロット1に書き込む
  • Thread0 2
  • スレッド2から読み出したスロットでバッファにエントリを書き込むスロットのバッファにエントリを書き込みます。出力にスロット1および書き込み
  • スレッド1がスレッド2がスロット2から読み出して出力
0に書き込む スロットにスロット2のエントリを読み取りと書き込み

物理メモリのレイアウトを考えると、slot1とslot2はメモリ内で隣り合っているといいでしょう。例えば、それらはバイト配列のサブセットである可能性があります。ご覧のように、別のスレッド(多分異なるCPUコア)から、非常に隣接するメモリのチャンクに読み書きしているため、誤った共有/キャッシュラインがバウンドしてしまうことがあります。それに加えて、メモリを介した読み書きは線形ではないので、CPUキャッシュの利点のいくつかを逃すことになります。

よりよいかもしれないいくつかの他のオプション:

  • は、最初のリングバッファは、生データで別々のringbuffersを、持っている、第二リングバッファは、非整列化イベントです。このように、これらのコストを避けるために、データは十分にメモリ内で分離されています。しかし、これは帯域幅に影響を与えます。

  • unmarshallerと作業を同じハンドラで直接行います。アンマーシャラーとハンドラーの作業量に応じて、これは実行可能な可能性があります。

関連する問題