現在、本 Microsoft .NET-Architecting Applications for the Enterprise を通じてイベントソーシングについて学んでいます。私の言葉では、イベントソーシングは、「現在のエンティティ」ではなく「イベント」を格納するアーキテクチャパターンです。現在のエンティティは、それに属するイベントをループすることで作成できます。
現在のエンティティの作成のパフォーマンスの問題は、現在のエンティティが定期的に「スナップショット」される追加のストレージを作成することで軽減できます(以前のスナップショットとその後に発生したイベントから作成されます)。
この本では、イベントソースに属するアーキテクチャは次のように設定されています。
ここでは、すべてのイベント(ウォーターポロの試合に関連する)がNoSQL RavenDBストアに格納されます。また、イベントを追跡するためのバスや、イベントのグループに属するサガも見えます。
イベントソーシングについていくつか質問があります(すべての質問は本の説明に関連しているため、すべてを一度に尋ねることにしました)。
イベントストレージ
イベントストレージはアプリケーションに依存しますが、イベントに柔軟なストレージを使用すると(NoSQL DB、JSONまたはXML)、はるかに簡単になります。更新の処理方法は、可用性の要件と更新のタイムフレーム、イベントの量などを考慮する必要があるいくつかの要因によって異なります。
佐賀の
サガとは、基本的には、バラバラに切り刻まれた長期にわたるイベントです。これは、さまざまな理由が原因である可能性があります。トランザクションによるブロックを回避するために複数のイベントが並行して処理されるアクションが必要な場合、複数の外部システムを調整する必要がある場合、またはイベントと調整する必要がある場合が考えられます境界のあるコンテキストと交差します。その理由のために、それらを永続化する必要があります。サガを開始し、いくつかのイベントを起動できます。また、非決定的な時点で、さらにイベントを起動して再開する必要がある場合があります。 Udi Dahanはこれについて 紹介 を持っています。
メッセージバス
バスについて言えることはたくさんあります。これらはイベントのストレージの大部分を抽象化し、たとえばイベントストアを操作する必要のある複数のアプリケーションがある場合など、より複雑なシナリオを処理できます。小さなアプリケーションの場合、イベントストアに直接書き込むことができます(それを行うコードはバスと見なすことができます...)
最新のデータ
短い答え:そうではありません。イベントソーシングは、「最終的に一貫性がある」ため、いくつかの方法でこれを回避します。この例では、預金が表示されるまでに最大10分かかる可能性があるというメッセージをユーザーに表示するだけです...