イベントによって統合された複数のシステムがあり、それらすべてがイベント ソーシングを使用しているとします。イベントはどこに保存しますか?
私の場合、3 つのシステムがあります。
- ショップであるウェブサイト
- 顧客、製品などを管理する Web サイトのバックエンド。
- 会計システム
これらのシステムの 1 つでドメイン イベントが発生するたびに、イベントが公開され、他のシステムで処理できます。すべてのシステムがイベント ソーシングを使用しています。
イベントをどこに保存するのか疑問に思っています。もちろん、各システムは処理したすべてのイベントを保存する必要があります。これは、イベント ソーシングを使用しているため、一度処理したイベントに依存するためです。
しかし、必要がないためにシステムがサブスクライブしなかったその他のイベントについてはどうでしょうか。システムが持続しなかった過去のイベントを処理する必要があるなど、要件が変更される可能性があるという事実に苦労しています。発生時にサブスクライブしなかったイベントをシステムが処理する必要がある場合、これらのイベントをどこから取得しますか?
この時点で、イベント ソーシングを使用しないシステムとは大きな違いがあると思います。データに依存するシステム A に機能を実装する必要があり、それは A では利用できないが、別のシステム B では利用でき、NHibernate のような ORM ツールを介して現在の状態を永続化する場合、そのデータを A から B にインポートするだけです。 . イベント ソーシングを使用するシステムは、現在の状態に到達するためにイベントに依存するため、過去に見逃したが現在必要なすべてのイベントをインポートする必要があります。
私にとって、この問題にはいくつかの異なるアプローチがあります。
- 各システムは、発行されたすべてのイベントを保存します。これにより、必要に応じてイベントを再公開したり、別のシステムにインポートしたりできます。
- 各システムは、(まだ) 処理する必要のないものも含め、発生したすべてのイベントを保存します。
- すべてのシステムからのすべてのイベントは、中央のイベント ログに保存されます。過去に発生したイベントを処理する必要があるが、サブスクライブしていない場合は、ここからインポートできます。
このような状況にどのように対処しますか?イベントをどこに保存しますか?
編集
Roy Dictus さん、ご回答ありがとうございます。次の状況を処理する方法がまだわかりません。
この Web サイトは、CustomerRegistered、CustomerPurchasedProduct、CustomerMarkedProductAsFavorite というイベントを発行します。バックエンドの現在のバージョンでは、顧客を表示する必要があり、その購入を表示する必要があります。顧客がお気に入りとしてマークしたものは、そのバージョンのシステムには関係ありません。したがって、バックエンドは CustomerRegistered と CustomerPurchasedProduct のみをサブスクライブします。
ここで、マーケティング部門は、お気に入りの製品に関する情報を顧客の詳細ページに表示することも望んでいます。バックエンドは CustomerMarkedProductAsFavorite をサブスクライブしていないため、この情報はバックエンドでは利用できません。その情報はどこから入手できますか?