問題タブ [disruptor-pattern]
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.
java - LMAX を実際の金融アプリケーションに統合する方法
また、ディスラプター パターンをアプリケーションに統合することも考えています。ディスラプターを使い始める前に、いくつかのことについて少し確信が持てません
- 私は 3 つのプロデューサーを持っています。主に、リクエストを逆シリアル化する FIX スレッドです。市場の動きに合わせて注文価格を継続的に変更する別のスレッド。また、GUI アプリケーションから送信されたリクエストをデシリアライズするスレッドがもう 1 つあります。現在、3 つのスレッドすべてがブロッキング キューに書き込みを行っています (したがって、キューで多くの競合が発生しています)。
- ディスラプターはシングル ライターの原則について語っています。上記の 3 つのスレッドをシングル ライターの原則に従わせることができる方法はありますか?
- また、典型的なリクエスト/レスポンス アプリケーションでは、特に私たちのケースでは、リクエストが同じ順序で発生している間に、レスポンスでキャッシュを更新するときにキャッシュをロックする必要があるため、メモリ内キャッシュで競合が発生します。ディスラプターを介してこれをどのように処理するか、つまり、特定のリクエストへの応答をどのように結び付けるか? はいの場合、キャッシュのロックを解除できますか?
任意の提案/指針をいただければ幸いです。現在Java 1.6を使用しています
timeout - LMAX Disruptor Queue にタイムアウト機能を適用するにはどうすればよいですか?
LMAX Disruptor http://code.google.com/p/disruptor/の開発者/ユーザーへ:
私の質問: EventHandler を使用するなど、Disruptor にタイムアウト機能を適用する方法を提案できる人はいますか?
私の仕事で思いついたシナリオの 1 つを次に示します。
- Outbox - ネットワーク経由でサーバーに送信されるメッセージ
- 受信トレイ - サーバーから受信した ACK メッセージ
- ACK ハンドラ - 送信トレイ メッセージを ACK 済みとしてマークします
- タイムアウト ハンドラ - 送信トレイ メッセージを NACKed としてマークします (非常に必要ですが、ディスラプターの設計のどこに適合しますか?)
同じ意見の人はいますか?または、それが不要な理由を誰でも指摘できますか。その後の議論が簡潔になることを願っています。
ありがとうございました。
java - このJavaアプリは、スレッドを拡張したりランナブルを実装したりせずに複数のスレッドを実行していますか?
私は Java を学んでおり、runnable を使用して既存のアプリで少しマルチスレッドを実行することができました。(スレッド間で変数を共有するために)ディスラプターを見ていましたが、作成者が実際にどのようにスレッドを生成しているのかわかりません。
彼は実行可能なクラスをプログラムに送信するために使用するエグゼキューターを使用しているようですが、この例では送信(または実行可能)はありません。私はOracleのチュートリアルから知っていることだけを学びました.2つの方法は、スレッドを拡張するか、実行可能を実装することです. 私は何かを見逃していますか、それともこの人は別の方法でそれをやっていますか? 私の最終的な目標は、このコード (完全に機能する) を理解し、既存の (実行可能なコードを使用して) コードに適用できるようにすることです。
問題のコードは次のとおりです。
更新: ディスラプターがスレッドのスポーンを処理している場合、既存の実行可能なクラスをディスラプターに送信するにはどうすればよいですか? または、コードをもう一度作り直す必要がありますか? 申し訳ありませんが、ディスラプターが既存のコードで動作するのか、それとも自分のものを完全に変更する必要があるのか について少し混乱しています.
java - ディスラプターかJMSか?
ディスラプターは実際に JMS ではなくアプリケーションの代わりになるのでしょうか? 現在、JMS メッセージを使用してタスクを転送しています。
ディスラプターは、メッセージ転送のためにそれを置き換えることを意図していますか? それぞれの長所/短所は何ですか?
現在、私は JMS を使用しています。メッセージをキューに送信するプロデューサーと、メッセージをキューから引き出すコンシューマー (MDB) があります。
ありがとう。
java - ディスラプターhelloworldの例
Disruptorフレームワークを学びたいです。Javaプログラム言語を使用してmainメソッドで実行できるhelloworldの例を教えてくれる人はいますか?
java - Java Disruptor パターンと低レイテンシー
Q1) Java Disruptor パターンに精通している人で、結果をベンチマークしたメッセージのサイズを知っている人はいますか? 私は同様のシステムを (純粋な興味から) 作成していますが、彼らのテストの説明を読んだときに、送信されたメッセージ サイズについて言及されていませんか?
http://code.google.com/p/disruptor/wiki/PerformanceResults
Q2) ディスラプターは、コンピューター間通信またはプロセス間通信のどちらですか? 私は当初、それがコンピューターからコンピューターへの印象を持っていましたが、彼らの作品は「インタースレッド」メッセージングライブラリとラベル付けされていますか?
multithreading - 可変期間の「ビジネス ロジック」を使用したディスラプター パターン
可変期間の「ビジネス ロジック」タスクがあるプロセスでディスラプターを効果的に使用するにはどうすればよいですか? 以前に行われたことがありますか?
応答ステージを処理する 2 番目のリング バッファーで実行できますか? もしそうなら、どうすればいいですか?
ディスラプターを理解し、コール チェーンの特定の部分に概念を適用できることを確認しました。具体的には、アプリケーションは次の手順を実行するミドルウェア タイプのアプリケーションです。
- 受信メッセージを読み取り、アンマーシャリングしてリクエストする
- リクエストの顧客の詳細を特定し、処理するワークフロー手順を決定します
- バックエンド システムを呼び出してステップを実行する
- 応答を照合し、応答をログに記録し、マーシャリングして、消費者に返す
問題は、バックエンド ステップの一部のインスタンスに「長い」時間がかかる可能性があることです。これにより、実行時間の短いタスクの応答ステージが実行時間の長いタスクを待機する可能性があります。バックエンド システムの呼び出しは、非同期または同期のいずれかで実行できると仮定します。そのため、バックエンド システム コールは、バックエンドへの非同期要求をトリガーする単なるコンシューマーであるという考えになります。
バックエンド システムの応答時間は、5 ミリ秒 (一部の要求)、50 ミリ秒 (要求の 90%) から - 5000 ミリ秒 (要求の 1%) の範囲です (大きなディスク I/O を考えてください)。
ディスラプターは非常に効率的である可能性があると考えていますが、平均レイテンシを低く抑えるためにこのハードルを回避することはできません.
shared - LMAX のディスラプターは、共有変数を持つ複数のプロデューサーとどのように連携しますか?
ディスラプター初心者です。次の2つのクエリがあります。
Q1. 1 つのプロデューサーから 1 つのコンシューマーへ、1 つのプロデューサーから複数の従属コンシューマーへのサンプル コードを取得しました。
複数のプロデューサーから複数のコンシューマーまたはシーケンサーのサンプル コード (3P – 1C) を取得したいと考えています。ブログやコード サンプルを参照してもらえますか?
Q2. これは、複数のプロデューサ環境で、1 つのプロデューサの結果がリング バッファ内の前のプロデューサの結果とどのように関連するかに関する一般的な質問です。
例: Is Disruptor は、単一のファイル/変数が複数のプロデューサーによって更新される環境で使用できます。つまり、2 つのプロデューサー (P1、P2) があり、1 つの共有変数 ("count" という名前) を更新しています (ここで、count は ValueEvent クラスのインスタンス変数です)。
最初の「count」値は 0 です。
プロデューサー P1 は、「カウント」の現在の値に 1 を追加します。したがって、プロデューサー P1 が処理された後、count の値は (0+1) = 1 になります。
プロデューサー P2 は現在の「カウント」値に 2 を加算します。したがって、プロデューサー P2 が処理した後、カウントの値は (1+2) = 3 になります。
基本的に、P2 は更新された「カウント」値 (P1 によって行われる) をリング バッファーから読み取り、インクリメントされた値を追加する必要があります (2)。
プロデューサーの実行順序を維持するにはどうすればよいでしょうか? (P2 は常に P1 の実行後に実行されます。)
コンシューマー側では、コンシューマー (C1,C2) は「カウント」値を順次 (1,3,.,.,.) として読み取ります。これは問題ありません。リング バッファーでは、各コンシューマーはリング バッファーの値を順番にのみ読み取ります。
ありがとう、プラセンジット。
c - LMAX ディスラプター キューに代わる高性能の代替手段は何ですか?
私は Disruptor Queues の内部 C 実装のパフォーマンス テストに取り組んでおり、スレッド以外のイベント ストリーム処理に対する他の同様のアプローチのベンチマークを行いたいと考えています。Google にはほとんどないので、ポインタや提案は大歓迎です。
consumer - LMAX Disruptor パターンでコンシューマ (eventProcessor) が遅くなる問題の解決策
ディスラプターの使用中に、遅れているコンシューマーが存在する可能性があり、その遅いコンシューマーのために、アプリケーション全体が影響を受けます。
すべてのプロデューサー (パブリッシャー) とコンシューマー (EventProcessor) がそれぞれ 1 つのスレッドで実行されていることを念頭に置いて、遅いコンシューマーの問題を解決するにはどうすればよいでしょうか?
単一のコンシューマーで複数のスレッドを使用できますか? そうでない場合、より良い代替手段は何ですか?