私はEventStoreを学ぼうとしています。コンセプトは気に入っていますが、実際に適用しようとすると、同じ点で行き詰まります。コードを見てみましょう:
foreach (var k in stream.CommittedEvents)
{
//handling events
}
それについての2つの質問:
メンテナンス後にアプリが起動した場合、どのイベントが読み取りを開始するかを安全な方法でブックマークするにはどうすればよいですか?使用するパターンはありますか?
イベントがすべて消費されるとすぐに、サイクルは終了します...実行時に到着するメッセージはどうですか?新しいメッセージが到着するまで(もちろんスレッドで処理する必要があります)、またはBeginRead EndReadのようなものが表示されるまで、呼び出しがブロックされることを期待します。
ランタイムイベントを処理するためにESBをバインドする必要がありますか、それともEventSoreはこれを行うための機能を提供しますか?
例を挙げて説明しようと思います 集計が金融ポートフォリオであり、アプリケーションがそのポートフォリオをトレーダーに示すアプリケーションであるとします。トレーダーがWebアプリに接続し、自分のポートフォリオを調べたとします。現在の状態は履歴全体になるので、状態を再現するために潜在的に多くのレコードを読み取る必要があります。これはいわゆるスナップショットで実行できると思いますが、作成の責任者は誰ですか?いつ集合体を作成することを選択する必要がありますか?集合体のスナップショットが存在することをどのように推測できますか?ランタイム部分の場合:ユーザーが再構築されたポートフォリオの状態を確認するとすぐに、リアルタイム部分の実行が開始されます。ユーザーは注文を行うことができ、市場でその注文を正常に実行することで新しいポジションを作成できます。ポートフォリオはインフラストラクチャによってどのように更新されますか?私は期待しますが、多分私は完全に間違っています同じイベントストリームがその新しいイベントのソースであり、新しいロングポジションです。それ以外の場合は、同じアグリゲートの状態を処理する2つのパスがあります。これが戦略がどのように機能するかを知りたいのですが、2つの州のエージェントがいるのは少し難しいと感じても、重複する可能性があります。重複をどのように恐れているかを明確にするために:
- イベントはべき等でなければならないことを知っているので、とにかく問題ではないはずです、
- しかし、次のことを考えてみましょう。
イベントをストリーミングする前にイベントバスをサブスクライブして、ポートフォリオの状態を更新します。いくつかの「オープンポジションイベント」がバスに表示されます。私はそれらを処理する必要がありますが、ポートフォリオはまだ実現されていないため、処理するための正しい状態ではない可能性があります。そのようなイベントを処理できたとしても、ストリームを読むと再びそれらを見つけることができます。
もっと陰湿です:私はストリームを開き、すべてのイベントを読み、状態を作成します。次に、バスをサブスクライブします。ステラムの読み取りが終了してからサブスクリプションが開始されるまでの途中で、バス上のメッセージが発生します。これらのイベントが欠落しており、集計が正しい状態ではありません。
すべて我慢してください、私の英語は貧弱で、議論はトリッキーです、私が私の疑問を共有することができたことを願っています:)