問題タブ [lmax]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - LMAX ディスラプター タイムアウト EventHandler
Disruptor フレームワークを使用するシステムがあり、EvenetHandler を実装する 5 つのステージが登録されています。
ステージはシーケンスで機能するため、リクエストは最初のステージが完了したときにのみ 2 番目のステージに移動できます。この移動は Disruptor によって内部的に維持されます。
第 3 段階に問題があります。これは、異なる HTTP 呼び出しを行い、応答を要求オブジェクトに格納するため、多くの時間がかかるボトルネックです。
したがって、第 3 段階でしばらく時間が経過した後、要求を (応答が何であれ) 第 4 段階と第 5 段階に進めたいと考えています。
特定のステージ (この場合は第 3 ステージ) をタイムアウトして、リクエストを次のステージに強制的に移動するにはどうすればよいですか?
または、
定義されたタイムアウトの後にトリガーされるイベントを登録する方法はありますか?これはシステムレベルのタイムアウトのようなものでしょうか?
disruptor-pattern - アプリケーション内のディスラプターの最大数
LMAX ディスラプターを使用して、アプリケーションで 5 ~ 10 個のディスラプターを一緒に使用した場合 (すべてのディスラプターが 1 つのコンシューマーを持ち、指定されたタスクを実行し、メッセージを次のディスラプターに引き渡すような、一連のディスラプターのようなもの) を観察しました。 / ringbuffer)、CPU 使用率が 90% 以上に達し、アプリケーションを停止するまでシステムが応答しなくなります。これは、アクティブなディスラプター スレッドが非常に多いためだと感じています。これは、ディスラプターが実際には何も処理していない場合でも発生します。アプリケーションで使用するディスラプターの最適な数について、誰かコメントできますか?
c++ - LMAX ディスラプターのようなパターンで、遅いコンシューマーをどのように処理しますか?
マルチ プロデューサーと x86 Linux で実行されている単一のコンシューマーを持つリング バッファーのような lmax ディスラプターでコンシューマーが遅い場合の対処法について質問があります。リング バッファ パターンのような lmax を使用すると、常にデータを上書きしますが、消費者が遅い場合はどうなりますか。したがって、たとえば 10 サイズのリング バッファ 0 ~ 9 のリング スロットでコンシューマがスロット 5 にあり、ライターがバッファのスロット 5 でもあるスロット 15 の書き込みを開始する準備ができている場合をどのように処理しますか (つまり、スロット5 = 15 % 10 )? ライターが入ってきた順にデータを生成し、クライアントが同じ順序でデータを受け取るように、これを処理する一般的な方法は何ですか? それは本当に私の質問です。以下は私の設計に関する詳細であり、問題なく動作しますが、現在この問題を処理する良い方法がありません。
設計仕様
リング バッファーがあり、現在、設計には複数のプロデューサー スレッドと 1 つのコンシューマー スレッドがあります。デザインのこの部分は既存のものであり、現在変更することはできません。ロック フリー リング バッファを使用して、既存のキューイング システムを削除しようとしています。私が持っているものは次のとおりです。
コードは x86 Linux で実行され、ライター用に複数のスレッドが実行され、リーダー用に 1 つのスレッドが実行されます。リーダーとライターは 1 スロット離れて開始するstd::atomic<uint64_t>
ため、リーダーはスロット 0 から開始し、ライターはスロット 1 から開始し、各ライターは最初に、以下に示すfetch_add(1, std::memory_order::memory_order_acq_rel)
呼び出しによってライター シーケンスでアトミックを実行してスロットを要求incrementSequence
し、その後、compare_and_swap ループを使用します。このスロットが利用可能であることをクライアントに知らせるためにリーダー シーケンスを更新するには、 を参照してくださいupdateSequence
。
java - (LMAX ディスラプター)コールバックではなく自分でデータを取得するには?
LMAX ディスラプターが高性能なスレッド間メッセージング ライブラリであることを知りました。しかし、使用しようとすると、イベントハンドラーがコールバックメソッドを使用してデータを処理することがわかりました。
パブリッシャーが RingBuffer にイベントを発行したときに呼び出されます
しかし、コールバックを使用してデータを取得しない場合は、while(true) を記述して自分でデータを取得します。どうすればよいですか?
ありがとう!
java - Lmax ディスラプター ダイヤモンド (生産者 1 人 5 消費者 1 人が結論) を見つける方法の例は?
github の Lmax ディスラプターのユーザー ガイドは非常にシンプルであることがわかりました。現在、1 つのプロデューサーと 5 つの消費者に問題があります。その後、消費者の結果を結論付ける必要があります。デモはありますか、Lmax ディスラプター ダイヤモンドを見つける方法はありますか(1 人の生産者 5 人の消費者 1 人の結論)例?
どうもありがとう!
multithreading - ディスラプターは、例外が発生したときに複数の EventHandler をパーク/停止します
EventHandler の 1 つが壊れたときに、CPU 使用率が高い状況に陥りました。
EventHanlders
バッファーを介して順次実行するように構成された複数のコンシューマー ( ) があるとします。最初の EventHandler が例外をスローした場合、他のすべての EventHandler を停止する (そして後で起こす) 方法はありますか?
私たちが行っていることは、失敗したスレッドをスリープ状態にしてから、同じイベントを再度消費しようとすることです。RingBuffer
しかし、他のスレッドが引き続き実行され、読み取るイベントがない場合でも読み取りを試行し、CPU が許容レベルよりも低下していることに気付きました。
通常の条件下では期待どおりに動作するためWaitStrategy
、これが原因で発生していることを今のところ破棄します。disruptor
を使用してBlockingWaitStrategy
おります。
例のためにいくつかの説明
ここで、INPUT は からポーリングされたイベントでRingBuffer
、A、B、C、および D は順次実行されるさまざまな EventHandler です。A* は、例外をスローする消費者です。
私たちが達成したいことは、コンシューマ A がイベントを消費できない場合 (例: 例外が発生した後)、そのコンシューマの OnEvent(...) メソッドは終了せず、再び消費を試みる通常のスリープでループにとどまることです。起きたら同じイベント。その間、他のすべてのコンシューマーは、A が成功するまでパークまたはスリープ状態にする必要があります。
ディスラプター バージョン 3.3.0 を使用しています。
私はグーグルで検索しましたが、有効な解決策が見つかりませんでした。
前もって感謝します。
サルバ。