私は単一ページの Web アプリケーションを構築しており、サーバー側のイベント ストリームを利用してクライアントを最新の状態に保つことを計画しています。
これを考えている間に、私が考えた同時実行シナリオがあり、実装を計画しているソリューションが最適かどうかはわかりません。
- UI はイベント ストリームをサブスクライブし、時間 X からすべての新しいイベントを受信します。
- UI は、時間ごとにさまざまなエンドポイントからデータをロードします
X
。たとえば、アクティブ ユーザーの総数です。 - ある時点でユーザーが非アクティブに
X
なり、UserDeactivated イベントがストリームに追加されます。 - UI は、時間に UserDeactivated イベントを受け取り
X+1
ます。
その時点で、UI はアクティブ ユーザーの合計数をやみくもに 1 減らすことはできません。これは、既に読み込まれている合計が既に非アクティブ化を反映している可能性があるためです。
この問題に使用する予定のアプローチは、すべてのデータがロードされた日付と時刻を追跡し、イベント ストリームをサブスクライブして、イベントをapplication_loaded_time - some_offset
見逃していないことを確認することです。
次に、イベントが受信されると、すべてのサブスクライバーは、保持する責任があるデータがフェッチされた日時を確認し、イベントが発生した後にイベントが発生した場合はイベントを適用しdata_fetching_datetime
、イベントが以前に発生した場合は無視しdata_fetching_datetime
ます。
それは良い同期戦略でしょうか? アプローチに欠けているものはありますか?より良い方法はありますか?
確認しなければならないことの 1 つは、クライアントの時刻がサーバーと同期していないことです。おそらく、リクエストの処理がいつ開始されたかを指定するカスタム HTTP ヘッダーを追加する必要があります。
個々の集計については、ロードした AR のバージョンとイベントのバージョンに頼ることができますが、カウントなどの集計されたクエリについては、利用できるそのようなバージョンはありません。
注: 私はイベント ソーシングも CQRS も行っていません。予測もありません。プロジェクションを使用すると、結果とともに返すことができる各ビューのシーケンス番号 (最後に処理されたイベント) を取得できますが、ここではそうではありません。クエリが作成された時点で特定のタイプのイベントの数を数えることで、すべてのクエリのバージョン番号を計算できると思いますが、それがうまく機能するかどうかはわかりません。