プロセスAにいくつかのエンティティの一貫したスナップショットがあるとします。そして、このエンティティの更新を常に受信しています。これで、クライアントBはAに接続し、Aが持つエンティティの一貫したスナップショットを受信し、Aが受信するすべての更新を受信する必要があります。
通常、同期要求の場合は、Aのスナップショットで読み取りロックを取得し、Aの更新で書き込みロックを取得します。これにより、状態をBに転送できます。
問題は、このプロセスを非同期にすることができるかどうかです。 BからAへのリクエストが非同期であることを意味しますか?
ここで CHANDY–LAMPORT またはLAI–YANGアルゴリズムを使用できますか?私は分散アルゴリズムにかなり慣れていないので、いくつかの専門知識を探しています。
概要
これは、その問題を解決する1つの方法です。リクエストを想像してみてください。これには、要求を定義する情報(データの更新であるか、現在のデータの要求であるか)、要求が実行されたこと、およびその結果を要求者に通知する方法が含まれています。
次は、キューがあります。リクエストをキューに入れ、ある時点でリクエストの結果が通知されます。これはブロックすることで同期的に行うことができますが、非同期コールバックまたはイベント通知をお勧めします。
最後に、リクエストを一度に1つずつ処理するエージェント(またはワーカー)があります。そうすれば、現在の状態に対する要求は常に一貫しています。シングルスレッドであるため、オブジェクトをロックする必要がなく、すばやくアクセスできます。
実装
このシステムは通常、単一のコンシューマーでメッセージキューを使用して実装されます。 RPCスタイルでのメッセージキューの使用の詳細を参照してください Rabbit MQチュートリアル 。ただし、スレッドセーフFIFOキューオブジェクトを使用して、サーバー上で実行されている単一のアプリケーションにパターンを縮小できます。