コメントを明確にするために、より大きなスペースが必要だと判断した
4 つのマイクロサービスがあることは明らかです。
それはまったく明らかではないと思います。
この特定の画像は
https://github.com/cer/event-sourcing-examplesからのものです
概要の中で、Richardson は次のように書いています。
One of the neat things about the modular architecture is
that there are two ways to deploy these four services:
monolithic-service - all services are packaged as a single Spring Boot executable JAR
Microservices - three separate Spring Boot executable JARs
accounts-command-side-service - command-side accounts
transactions-command-side-service - command-side money transfers
accounts-query-side-service - Account View Updater and Account View Reader
Scala By the Bay でプレゼンテーションを行った彼は、1 つのマイクロサービスがイベント ストアにパブリッシュし、2 つ目のマイクロサービスがそれらのイベントをサブスクライブしてビュー ストアを更新するパターンを指摘しました。
したがって、これを 1 つ、2 つ、3 つ、または 4 つのマイクロサービスとして数えることについて、公正な議論を行うことができると思います。
カウントする際に考慮すべきことの 1 つは、イベント内に含まれる状態情報を理解してビュー (アカウント ビュービュー ストアからデータをコピーするだけなので、読者はこの共有された理解を必要としません)。
Udi Dahanは、サービスの境界について興味深いことを述べています。特に、サービスが公に共有するデータの量を制限することで、サービス間の疎結合を維持する必要があります。
彼のガイドラインをこのダイアグラムに当てはめると、アカウント ビューと 2 つの集計は同じ境界の一部でなければならないことがわかります。これらはすべて、このサービスのプライベートなデータにアクセスできるからです。
もちろん、イベント スキーマに対する下位互換性のある変更を慎重に保持する場合は、これら 4 つのサービス コンポーネントを個別に設計することもできます。
4 つのマイクロサービスがあることは明らかですが、「コマンド側」のマイクロサービスには独自のデータベースがないため、わかりません。
これら 2 つのマイクロサービスは、たまたま同じ物理ストアである別個の論理イベント ストアを持つと見なすことができます。これらの論理ストアの 1 つを移行する必要があると判断した場合、頭痛の種になる可能性がありますが、集約イベント ストリームは互いに分離されているため、アカウントと転送の間の結合についてあまり心配する必要はありません。
そして、EventStore db はどのようにすべきでしょうか? シングルテーブル?サービスごとに 1 つのテーブル ?
イベント ストアの典型的なリレーショナル スキーマは、イベント自体を BLOB として扱い、他のテーブルと結合できるように、一部のメタ データ (たとえば、eventId) を公開します。したがって、ジェネリック ストアはおそらく、イベントを保持する 1 つのテーブルと、イベント ストリームを保持する別のテーブルのように見えます。イベント ソーシングを使用する場合のイベントの格納におけるリレーショナル スキーマの説明へのリンクがいくつかあります。
スキーマを複数の物理テーブルに分割/分割したい場合は、それも可能です。
使用できる非リレーショナル ストアもあります。Event Store (オープン ソース)の詳細を調べると、ストアの実装方法について多くを学ぶことができます。
または、単にブラック ボックスとして扱うこともできます。