2017-01-20 6 views
3

私はイベントソーシングパターンを学んでいます。私は1つのことを理解できません。イベントソースパターン:現在の状態を保存しないでください。

への指示がありません。は、多くのチュートリアルでDBのエンティティの現在の状態を保存していません。開発者は、必要なエンティティに関連するDBからすべてのイベント(「イベントストリーム」)を抽出するためのインフラストラクチャを構築し、その後、新しい必要なタイプのオブジェクトに適用して最終的に現在の状態にする必要があります。

銀行口座にしてください。

  1. エキス、その時点で、すべての関連イベント(おそらくDBで何千ものイベントがある)無料でお金の
  2. 計算量を:私はしなければならない私のクライアント彼女の現在のアカウントの状態に戻ります。

ただし、パフォーマンスはどうですか?私はすべてのアカウントの現在の状態を保存する方が良いと思っています。新しいイベントはすぐにそれに副作用をもたらすでしょう。私は正しくないのですか?

+0

これは、イベント調達の全ポイントです。イベントから状態を再構築します。あなたがこれをしないと、あなたはイベント調達がありません。監査ログなどがあるかもしれません。したがって、その質問が何であるかを理解することは難しいです。 –

+0

@Alexey Zimarevイベントソーシングパターンのパフォーマンスの問題を解決する方法について質問しました。私は私の質問を理解することが難しいとは思わない。 – Mergasov

+1

パフォーマンスの問題はまだ経験しましたか? –

答えて

2

イベントソーシングの全体のポイントは、状態を一連の変更として保持することです。したがって、現在の状態をESとは逆にします。

パフォーマンス要件のために、更新が最初から適用されるのではなく、スナップショットの転送からのみ適用されるように、時にはsnapshotが作成されることがあります。イベントストアは、イベントソーシングを使用するアプリケーションを対象とした特殊データベースであり、スナップショット機能out of the boxを提供できます。

他の部分は、ESが読み書きモデルを分離するCQRS - Command Query Responsibility Segregationパターンと相補的であるということです(以前のリンクではそれほど正しくはありませんでしたが、this oneを参照してください)。次に実行されているコマンドまたはドメインイベントは、現在の状態の非正規化された表現である読み取りモデルを継続的に更新するために使用されます。したがって、コマンドの場合は、イベント(ES)からドメインオブジェクトを作成して処理しますが、クエリの場合、イベントストアをバイパスし、リレーショナルデータベース、ドキュメントデータベースなどの最適化された読み取りモデルから直接データを取得しますあなたの読書シナリオのために。

ESで実装されているコマンド側のパフォーマンスよりも、主に読んでいるアプリケーションがある場合は、それほど重要ではないかもしれません。

ESのメリットはこの質問の範囲外であり、インターネットでかなりの情報を見つけることができます(特にGreg YoungとUdi Dahan)。私は個人的には少し懐疑的で、長時間実行しているビジネスシナリオを扱う場合は意味をなさないと思っています。

+0

あなたの答えとリンク、Zdeslavに感謝します。私のプロジェクトでは、あるエンティティオブジェクトに関連するすべての変更をトレースするためのインフラストラクチャを構築する必要があります。私は自分のシナリオでは、明確なES + CQRSパターンを実装するよりも、DBに「イベント」(ロギングとして)を格納する方が良いだろうと思います。 – Mergasov

+1

6〜7年前、ES/CQRSではなく「通常の」ドメインモデルを使用したプロジェクトに取り組んでいました。 ORMにNHibernateが使用されたので、私は[インターセプタ](http://nhibernate.info/doc/nhibernate-reference/events)を使用することができました。html) - 各モデルの更新/保存/削除で、私は変更されたフィールドのリストと、アクションを開始したユーザーのユーザー名とともにフィールド名と値を保存しました。数行のコードで監査証跡を完成する。 –

関連する問題