私のシステムには、タイプ A と B の 2 つの異なるタイプのメッセージがあります。各メッセージには異なる構造があります。タイプ A には int メンバーが含まれ、タイプ B には double メンバーが含まれます。私のシステムでは、両方のタイプのメッセージを多数のビジネス ロジック スレッドに渡す必要があります。待ち時間を短縮することは非常に重要であるため、ディスラプターを使用してメイン スレッドからビジネス ロジック スレッドにメッセージを機械的に適切に渡す方法を調査しています。
私の問題は、ディスラプターがリング バッファー内の 1 種類のオブジェクトしか受け付けないことです。これは、ディスラプタがリング バッファ内のオブジェクトを事前に割り当てるため、理にかなっています。ただし、Disruptor を介して 2 つの異なるタイプのメッセージをビジネス ロジック スレッドに渡すことも困難です。私が知る限り、次の 4 つのオプションがあります。
固定サイズのバイト配列を含むオブジェクトを使用するようにディスラプターを構成します( How should one use Disruptor (Disruptor Pattern) to build real-world message systems?で推奨されているように)。この場合、メイン スレッドはメッセージをディスラプタにパブリッシュする前にバイト配列にエンコードする必要があり、各ビジネス ロジック スレッドは受信時にバイト配列をデコードしてオブジェクトに戻す必要があります。このセットアップの欠点は、ビジネス ロジック スレッドが実際にはディスラプターからのメモリを共有していないことです。代わりに、ディスラプターによって提供されたバイト配列から新しいオブジェクトを作成しています (したがって、ガベージを作成しています)。このセットアップの利点は、すべてのビジネス ロジック スレッドが同じディスラプタから複数の異なるタイプのメッセージを読み取ることができることです。
単一タイプのオブジェクトを使用するようにディスラプターを構成しますが、オブジェクト タイプごとに 1 つずつ、複数のディスラプターを作成します。上記の場合、タイプ A のオブジェクト用とタイプ B のオブジェクト用の 2 つの個別のディスラプターがあります。このセットアップの利点は、メイン スレッドがオブジェクトをバイト配列にエンコードする必要がないことです。ビジネス レス ロジック スレッドは、ディスラプターで使用されるのと同じオブジェクトを共有できます (ガベージは作成されません)。このセットアップの欠点は、何らかの形で各ビジネス ロジック スレッドが複数のディスラプターからのメッセージをサブスクライブする必要があることです。
メッセージ A と B の両方のすべてのフィールドを含む単一タイプの「スーパー」オブジェクトを使用するようにディスラプターを構成します。
オブジェクト参照を使用するようにディスラプターを構成します。ただし、この場合、オブジェクトの事前割り当てとメモリの順序付けによるパフォーマンス上の利点が失われます。
この状況におすすめは?オプション #2 が最もクリーンなソリューションだと思いますが、消費者が複数のディスラプターからのメッセージを技術的にサブスクライブできるかどうか、またはどのようにサブスクライブできるかはわかりません。オプション#2を実装する方法の例を誰かが提供できれば、それは大歓迎です!