3

私はEventStoreを学ぼうとしています。コンセプトは気に入っていますが、実際に適用しようとすると、同じ点で行き詰まります。コードを見てみましょう:

foreach (var k in stream.CommittedEvents)
{ 
   //handling events
}

それについての2つの質問:

  • メンテナンス後にアプリが起動した場合、どのイベントが読み取りを開始するかを安全な方法でブックマークするにはどうすればよいですか?使用するパターンはありますか?

  • イベントがすべて消費されるとすぐに、サイクルは終了します...実行時に到着するメッセージはどうですか?新しいメッセージが到着するまで(もちろんスレッドで処理する必要があります)、またはBeginRead EndReadのようなものが表示されるまで、呼び出しがブロックされることを期待します。

ランタイムイベントを処理するためにESBをバインドする必要がありますか、それともEventSoreはこれを行うための機能を提供しますか?

例を挙げて説明しようと思います 集計が金融ポートフォリオであり、アプリケーションがそのポートフォリオをトレーダーに示すアプリケーションであるとします。トレーダーがWebアプリに接続し、自分のポートフォリオを調べたとします。現在の状態は履歴全体になるので、状態を再現するために潜在的に多くのレコードを読み取る必要があります。これはいわゆるスナップショットで実行できると思いますが、作成の責任者は誰ですか?いつ集合体を作成することを選択する必要がありますか?集合体のスナップショットが存在することをどのように推測できますか?ランタイム部分の場合:ユーザーが再構築されたポートフォリオの状態を確認するとすぐに、リアルタイム部分の実行が開始されます。ユーザーは注文を行うことができ、市場でその注文を正常に実行することで新しいポジションを作成できます。ポートフォリオはインフラストラクチャによってどのように更新されますか?私は期待しますが、多分私は完全に間違っています同じイベントストリームがその新しいイベントのソースであり、新しいロングポジションです。それ以外の場合は、同じアグリゲートの状態を処理する2つのパスがあります。これが戦略がどのように機能するかを知りたいのですが、2つの州のエージェントがいるのは少し難しいと感じても、重複する可能性があります。重複をどのように恐れているかを明確にするために:

  • イベントはべき等でなければならないことを知っているので、とにかく問題ではないはずです、
  • しかし、次のことを考えてみましょう。

イベントをストリーミングする前にイベントバスをサブスクライブして、ポートフォリオの状態を更新します。いくつかの「オープンポジションイベント」がバスに表示されます。私はそれらを処理する必要がありますが、ポートフォリオはまだ実現されていないため、処理するための正しい状態ではない可能性があります。そのようなイベントを処理できたとしても、ストリームを読むと再びそれらを見つけることができます。

もっと陰湿です:私はストリームを開き、すべてのイベントを読み、状態を作成します。次に、バスをサブスクライブします。ステラムの読み取りが終了してからサブスクリプションが開始されるまでの途中で、バス上のメッセージが発生します。これらのイベントが欠落しており、集計が正しい状態ではありません。

すべて我慢してください、私の英語は貧弱で、議論はトリッキーです、私が私の疑問を共有することができたことを願っています:)

4

1 に答える 1

12

現在の状態は履歴全体になるため、状態を再現するには潜在的に多くのレコードを読み取る必要があります。これは、いわゆるスナップショットによって行うことができると思いますが、それを作成する責任は誰にありますか?

CQRS とイベント ソーシングでは、クエリは、集計によって発行されたイベントから生成されるプロジェクションによって提供されます。イベント ストアから再構成された集約インスタンスを使用して情報を表示することはありません。

スナップショットという用語は、特にイベント ストアの最適化を指します。これにより、すべてのイベントを再生せずに集約を再構築できます。

プロジェクションは本質的に、集計の非正規化ビューを維持するイベント ハンドラーです。集約から発行されたイベントは、おそらく帯域外で発行され、プロジェクションはそれらのイベントをサブスクライブして処理します。たとえば、概要情報を表示する必要がある場合、プロジェクションは複数の集計を組み合わせることができます。取引アプリケーションの場合、通常、各ビューにはさまざまな集計からのデータが含まれます。プロジェクションは消費者主導の方法で設計されています。アプリケーションの要件によって、必要な基礎データのさまざまなビューが決まります。

このタイプのワークフローでは、アプリケーション全体で結果整合性を採用する必要があります。たとえば、エンド ユーザーがポートフォリオを表示して新しい取引を開始している場合、UI は更新をサブスクライブして、更新された予測を非同期で反映する必要があります。

CQRS とイベント ソーシングの概要については、こちらをご覧ください。

于 2012-12-14T00:58:34.023 に答える