4

LMAX と、RingBuffer と呼ばれるこの素晴らしい概念について紹介しました。そのため、1 つのスレッドのみでリングバッファーに書き込む場合、複数のプロデューサーを使用するよりもパフォーマンスが優れていると人々は言います...

ただし、典型的なアプリケーションがリングバッファーへの書き込みに1つのスレッドのみを使用する可能性があるとは本当に思いません... lmaxがどのようにそれを行っているかを本当に理解していません(もしそうなら)。たとえば、N 人の異なるトレーダーが取引所に注文を出すとします。これらはすべて、注文に変換されてリングバッファーに入れられる非同期の要求です。1 つのスレッドを使用してそれらをどのように書き込むことができるでしょうか?

質問 1. 何かが欠けているか、誤解している可能性がありますが、N 個の同時プロデューサーが存在する場合、それらを 1 つにマージし、互いにロックしないようにするにはどうすればよいですか?

質問 2. rxJava オブザーバブルを思い出しました。N 個のオブザーバブルを取得し、Observable.mergeを使用してそれらを 1 つにマージできましたが、何らかの方法でロックをブロックまたは維持しているのだろうか?

4

2 に答える 2

2

内部的には、RxJava のマージは、私がエミッターループと呼んでいるシリアライゼーション コンストラクトを使用しsynchronized、ブロックしています。

私たちの「クライアント」は、主にスループットとレイテンシに影響されない場合、または完全にシングルスレッドでブロッキングが問題にならない場合にマージを使用します。

私がqueue-drainと呼んでいるノンブロッキングシリアライザーを書くことは可能ですが、代わりにそれを使用するようにマージを構成することはできません。

また、プロデューサー スレッドとコンシューマー スレッドを手動で処理する場合は、 JCTools 'を直接参照することもできます。MpscArrayQueue

于 2015-05-14T14:09:25.397 に答える