01月14日

質問者さん

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

02月09日

かとじゅん

かとじゅんさん

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

かとじゅんさんに 質問してみましょう!

かとじゅん

かとじゅん

DDD/Scala,Rust/A-CSM,CSPO,CSD/NLP Practitioner/お仕事のご相談は➡ https://t.co/e6L5mvqaIx / 質問は➡https://t.co/m3VwQnynVZ / Github sponsor ➡ https://t.co/JC9amBhwM9

Tips質問回答方針

Tips額に応じて優先して詳細に回答します。

Tips報酬金額を選択する

(Tips質問者は回答全文をメール受領できます)

¥0(無料質問)

かとじゅんさんが

回答したTips質問

¥500

03月09日

いうも有益な情報発信にとても感謝しております。僭越ながら質問させて頂きます。 EventSourcing+CQRSに興味がありつつ、クライアントが「コマンドを投げてからクエリとして結果取得できるまで」のタイムラグを許容できないケースが多いのではないかと考えております。 一般的には、あるリソースにPOSTして成功したら、次にGETした時にはその結果を取得できると期待されると思っています。 ES+CQRSでは、クエリモデルを作成するprojectionが非同期に動くため、コマンド成功直後はクエリモデルがまだ生成されていないと認識しています。 この時、クライアント側が認識を変えてコマンド直後にクエリできないかもしれない、という前提で実装することも考えられますが、Spring WebFlux を使うと解決できるものなのでしょうか? クライアントがクエリモデルのストリームを購読していれば、projectionの結果をリアクティブに受け取れると思いました。 ES+CQRSの場合に、WebFluxを採用することについてのお考えをお聞かせ頂ければ幸いです。 よろしくお願いします。

¥500

いいね!

2023年12月01日

CQRS/ESを使うべきではないケースは、どのようなものがありますか?

かとじゅんさんが

「いいね」した質問

¥500

いいね!

2023年12月01日

CQRS/ESを使うべきではないケースは、どのようなものがありますか?

いいね!

2023年11月26日

どんなに高カロリーなものを食べても健康状態の意味で、べき等だった時代に戻りたいです。

かとじゅんさんが

最近答えた質問

¥500

03月09日

いうも有益な情報発信にとても感謝しております。僭越ながら質問させて頂きます。 EventSourcing+CQRSに興味がありつつ、クライアントが「コマンドを投げてからクエリとして結果取得できるまで」のタイムラグを許容できないケースが多いのではないかと考えております。 一般的には、あるリソースにPOSTして成功したら、次にGETした時にはその結果を取得できると期待されると思っています。 ES+CQRSでは、クエリモデルを作成するprojectionが非同期に動くため、コマンド成功直後はクエリモデルがまだ生成されていないと認識しています。 この時、クライアント側が認識を変えてコマンド直後にクエリできないかもしれない、という前提で実装することも考えられますが、Spring WebFlux を使うと解決できるものなのでしょうか? クライアントがクエリモデルのストリームを購読していれば、projectionの結果をリアクティブに受け取れると思いました。 ES+CQRSの場合に、WebFluxを採用することについてのお考えをお聞かせ頂ければ幸いです。 よろしくお願いします。

02月16日

ソフトウェアアーキテクトとしてのご自身のゴールはありますか。

02月09日

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