4

LMAX ディスラプターパターンでは、マスター ノードからスレーブ ノードに入力イベントをレプリケートするためにレプリケーターが使用されます。したがって、セットアップはおそらく次のようになります。

ここに画像の説明を入力

マスター ノードのレプリケータは、イベントを DB に書き込みます (DB に書き込むよりも優れたメカニズムを考えることができますが、問題のステートメントにはあまり重要ではありません)。スレーブ ノードのレシーバーは、DB から読み取り、イベントをスレーブ ノードのリング バッファーに配置します。

スレーブ ノードの出力イベントは無視されます。

ここで、マスター ノードのビジネス ロジック プロセッサがスレーブ ノードのビジネス ロジック プロセッサよりも遅くなる可能性があります。たとえば、マスタ ノードの BL はスロット 102 にあり、スレーブ ノードはスロット 106 にある可能性があります (これは、ビジネス ロジック プロセッサの前にリプリケータがリング バッファからイベントを読み取るために発生する可能性があります)。

このようなシナリオでは、マスター ノードに障害が発生し、スレーブ ノードがマスター ノードになると、外部システムがいくつかの重要なイベントを見逃す可能性があります。これは、スレーブ ノードとして機能していたノード 2 の出力が無視されるために発生する可能性があります。

Martin Fowler は、レプリケーターの仕事はノードの同期を維持することであると述べています。

しかし、ビジネス ロジック プロセッサの同期を維持する方法がわかりません。何か案は?

4

2 に答える 2

8

レプリケーションはマスターからスレーブ ノードに直接行われ、データベース経由ではありません。レプリケーションは、スレーブからの確認応答でゲートします。

http://www.infoq.com/presentations/LMAX

上記のリンクで詳細が説明されており、プレゼンテーションに関するコメント ディスカッションを読む価値があります。

于 2013-07-17T11:39:33.580 に答える
1

イベントをドロップするコストが低い場合は、それを無視できます (?)。

簡単な実装として、プライマリの出力ディスラプタから、パケットの送信が完了したことをスレーブに通知することができます。これを 2 段階のレプリケーターと考えてください。1 つはイベントをレプリケートし、2 番目のレプリケーターはイベントが送信されたことを確認します。

実際の実装では、アーキテクチャに追加のダウンストリーム サポートが必要になる場合があります (特に再生/再試行)。アプリケーションの要件によっては、出力イベントにギャップがあることを検出し、必要に応じてフェッチする機能が必要です。イベントがべき等であると仮定すると、時間をさかのぼってイベントを再生する問題はないはずです。

アウトバウンド チャネルで 1 つのパケットが失われたり、インターネット回線がダウンしたりしたとします。ディスラプターから正常に送信されたとしても、失われる可能性があります。これは特定のアプリケーションに依存し、どのような障害シナリオを許容できるかについて、ここで説明するよりも多くのことを考慮する必要があります。

于 2013-07-17T11:42:47.677 に答える