この記事は ZOZO #4 Advent Calendar 2021 16日目の記事になります。
今回のプロジェクトでCQRS/ESアーキテクチャの実装に挑戦しました。
構成としては上記のような感じです。
今回は詳細なアーキテクチャ、実装の話はあえてしませんが、実装していて気になった点を1点だけ共有します。
いまさら言うまでもなく、コマンドで登録されたEventは非同期でクエリ側のDBに共有されます。
そこには時間差が生じますが、結果整合性はシンプルなアーキテクチャを実現するためのトレードオフとなります。
しかし、APIを使う側はそうもいかないこともあります。これまで慣れてきた強整合のアーキテクチャと比較した際の違和感もあるでしょうし、コマンドの結果変更されたステートの情報をすぐに使いたいというニーズもあるでしょう。
そんなとき、大事になってくるのはコマンドAPIのレスポンスです。
コマンドAPIのレスポンスを丁寧に返してあげることで、クライアント側の不満をかなり減らせると思います。
現在のステート全体を返すのか、変更されたものだけ返すのか、その仕様は状況によるかと思いますが、少なくとも、コマンドのAPIを叩いた直後にクエリ側を叩く必要がないように、またはAPIのレスポンスとクエリの組み合わせできちんと課題が解決するようにしてあげるのがよいでしょう。
と今回のCQRS/ES実装の反省点でした。
明日は @daikon510 さんの記事になります。自分もZOZO #3 Advent Calendar 2021の方に「モジュラーモノリスに対する考察」というタイトルで書きます。