CQRS(+ES)について質問です。
以下の前提とします。
---
Webブラウザ上で実行されるJavaScriptからサーバサイドにコマンドを発行します。
例えば、Xのプロフィールを更新するようなイメージです。
---
この場合、クライアント側のフローとしては、以下のように考えれば良いでしょうか?
①クエリにより、Xのプロフィールをバージョン付きで取得
②プロフィールの変更内容とバージョンをコマンドとして発行
質問の趣旨としては、
「クライアントから、コマンド発行する際に利用するバージョンは、どのタイミングで取得するのが望ましいか」
というものになります。

かとじゅんさん
この質問は、CQRS/ESというより楽観的同時実行制御 (Optimistic Concurrency Control, OCC) の考え方に関係します。
1. クライアント側でバージョンを指定する場合
クライアントが 取得時のバージョン情報 を保持し、更新時にそのバージョンを含めてコマンドを送信。
サーバ側は、現在のバージョンと一致している場合のみ更新を適用。
メリット
クライアント主導で衝突検出でき、意図しない上書きを防げる。
リトライのロジックをクライアント側で自由に制御できる。
デメリット
更新失敗時にクライアントが適切にリトライを実装しないと、ユーザー体験が悪化。
クライアントが古いデータを持っている可能性があり、頻繁に更新があると失敗しやすい。
2. サーバ側で最新バージョンを使用する場合
クライアントは バージョンを指定せず に更新コマンドを発行。
サーバ側が最新のバージョンを確認し、適用可能なら更新。
メリット
クライアントの実装がシンプルになる。
サーバ側でリトライ戦略を組み込めば、クライアントは単にコマンドを投げるだけで済む。
デメリット
サーバが意図しないデータ変更を検出しづらい(例えば、間に別の更新が入っていた場合)。
競合解決のロジックをサーバ側で適切に設計しないと、意図しないデータ変更が発生しやすい。
どちらを選ぶべきか?
ユースケース次第 ですが、一般的な選択肢は次のようになります:
データの一貫性が重要 → クライアントでバージョンを指定(前者)
ユーザー体験を優先し、リトライの負担を軽減 → サーバ側でリトライ(後者)
例えば、金融取引や在庫管理のような正確性が求められるケース では クライアント側でバージョン指定 し、明示的に競合を検出した方が安全です。一方、ソーシャルメディアの投稿編集や一般的なユーザープロフィール更新 なら、サーバ側でのリトライ戦略 が有効な場合が多いですね。
どちらの方式を採用するにせよ、競合が起きた際の振る舞い(リトライ回数、UI での通知など)を設計するのがポイントになります。