web-dev-qa-db-ja.com

イベントソーシング、サガ、バス、結果整合性

現在、本 Microsoft .NET-Architecting Applications for the Enterprise を通じてイベントソーシングについて学んでいます。私の言葉では、イベントソーシングは、「現在のエンティティ」ではなく「イベント」を格納するアーキテクチャパターンです。現在のエンティティは、それに属するイベントをループすることで作成できます。

現在のエンティティの作成のパフォーマンスの問題は、現在のエンティティが定期的に「スナップショット」される追加のストレージを作成することで軽減できます(以前のスナップショットとその後に発生したイベントから作成されます)。

この本では、イベントソースに属するアーキテクチャは次のように設定されています。

Event Sourcing in the book

ここでは、すべてのイベント(ウォーターポロの試合に関連する)がNoSQL RavenDBストアに格納されます。また、イベントを追跡するためのバスや、イベントのグループに属するサガも見えます。

イベントソーシングについていくつか質問があります(すべての質問は本の説明に関連しているため、すべてを一度に尋ねることにしました)。

  • これらのイベントはどのように保存されるのでしょうか。イベントのデータは時間とともに変化する可能性があり(追加のプロパティ、新しいイベント名)、イベントは互いに簡単に関連付けられる必要があると想像できます。変更とデータ検索を容易にするために、データベースとデータアクセスコードの実際の構造はどのように見えますか?
  • サガとは?なぜサガと呼ばれるのですか?それらは永続化されていますか?
  • バスはどのように機能しますか?イベントをイベントストアに直接書き込むだけの場合の利点は何ですか?
  • 上記のアーキテクチャでコマンドとクエリが分離され(CQRS)、コマンドがクエリのスナップショットからの読み取り中にイベントソーシングを使用して実装されている場合、コマンドの開始中にデータを表示する必要があるとどうなりますか? (たとえば、ユーザーがこのデータに基づいて預金を行いたいときに銀行口座データを表示します。)実際には、表示されたデータが最新であることをどのように確認しますか?
5

イベントストレージ

イベントストレージはアプリケーションに依存しますが、イベントに柔軟なストレージを使用すると(NoSQL DB、JSONまたはXML)、はるかに簡単になります。更新の処理方法は、可用性の要件と更新のタイムフレーム、イベントの量などを考慮する必要があるいくつかの要因によって異なります。

  • アプリケーションの更新時にイベントを更新する:新しいアプリケーションのデプロイメントの一部として、以前のすべてのイベントを新しいスキーマに更新します。
  • イベントにバージョンを付ける:イベントにバージョンIDを付けます。イベントがデータベースから読み取られるとき、一部のコードは古いイベントを現在の構造に「アップグレード」する方法を知っています。最初のオプションと同様ですが、基本的に「オンデマンド」
  • 古いイベントを破棄する:アプリケーションが更新されたら、すべてのエンティティのスナップショットを作成し、古いイベントを破棄(またはアーカイブ)します。
  • 古いイベントを捨てないでください。基本的には「PurchaseOrder」を永久に保持します。別のフィールドが必要な場合は、「PurchaseOrderWithCouponCode」などの新しいイベントを使用します。

佐賀の

サガとは、基本的には、バラバラに切り刻まれた長期にわたるイベントです。これは、さまざまな理由が原因である可能性があります。トランザクションによるブロックを回避するために複数のイベントが並行して処理されるアクションが必要な場合、複数の外部システムを調整する必要がある場合、またはイベントと調整する必要がある場合が考えられます境界のあるコンテキストと交差します。その理由のために、それらを永続化する必要があります。サガを開始し、いくつかのイベントを起動できます。また、非決定的な時点で、さらにイベントを起動して再開する必要がある場合があります。 Udi Dahanはこれについて 紹介 を持っています。

メッセージバス

バスについて言えることはたくさんあります。これらはイベントのストレージの大部分を抽象化し、たとえばイベントストアを操作する必要のある複数のアプリケーションがある場合など、より複雑なシナリオを処理できます。小さなアプリケーションの場合、イベントストアに直接書き込むことができます(それを行うコードはバスと見なすことができます...)

最新のデータ

短い答え:そうではありません。イベントソーシングは、「最終的に一貫性がある」ため、いくつかの方法でこれを回避します。この例では、預金が表示されるまでに最大10分かかる可能性があるというメッセージをユーザーに表示するだけです...

5
JDT