問題タブ [event-sourcing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cqrs - Jonathan Oliver の EventStore は積極的に開発されていますか?
Windows Azure でホストされる新しいプロジェクトを開始しています。バックエンドとして RavenDb を使用しており、CQRS とイベント ソーシングを使用したいと考えています。
Jonathan の EventStore の良いレビューを読みましたが、それは私のアーキテクチャに完全に適合します。これは薄いレイヤーであり、RavenDb をストアとして使用できるからです。さて、3.0 リリース (最新の公式) は 1 年前のものであり、新しい 3.1 はまだリリースされていないことに気付きました (ブランチでいくつかの活動があります)。CommonDomain プロジェクトが統合されているため、3.1 バージョンを使用したいと考えていますが、バージョン 3.0 と現在の CommonDomain を別々に参照しても問題はありません。
特に Greg Young が彼の EventStore (geteventstore.com) をリリースして以来、EventStore が積極的に開発され、維持されるかどうかは疑問です。それには独自の永続性があり、私のイベントを RavenDb に保存できないことがわかっているので、私はそれに行くのを少しためらっています。
要約すると:
- ジョナサンの EventStore は稼働していますか?
- はいの場合、現在の公式の 3.0 リリースを使用して、CommonDomain プロジェクトを個別に参照する必要がありますか?
- 3.1 ブランチ (CommonDomain がマージされた) の準備はできていますか?
- 結局、Greg Young の EventStore に切り替える必要がありますか?
- それとも、Lokad.CQRS を調査する必要がありますか? (Jonathan の EventStore は使用していないと思います)
PS。Joliver の EventStore を fork したり、修正やマイナーな機能を提供したりすることは気にしません。
mongodb - MongoDBは一貫したイベントストアになることができますか?
イベントストアにイベントを保存する場合、特にイベントを後で投影してエンティティの現在の状態を復元する場合は、イベントが保存される順序が非常に重要です。
MongoDBは、その速度とflexibelスキーマを考えると、イベントストアを永続化するのに適しているようですが(多くの場合、そのように推奨されます)、MongoDBにはトランザクションなどがないため、正しいイベントの順序を保証できません。
その事実を考えると、一貫性のあるイベントストアを探している場合は、MongoDBを使用するのではなく、従来のRDMSを使用する必要がありますか、それともこの問題を回避する方法がありますか?
cqrs - イベント ソーシング: モデルの更新前または更新後にイベントを書き込む
イベント ソーシングについて考えていると、鶏が先か卵が先かという問題にたどり着くことがよくあります。これを回避する方法についてのいくつかのヒントに感謝します。
すべての I/O バウンド処理を非同期で実行する (つまり、イベント ログへの書き込み) 場合、どのように処理するか、場合によっては障害を検出するか?
私は Akka Actors を使用しているので、イベント/メッセージごとに処理が順次行われます。現時点ではデータベースはありません。代わりに、すべてのイベントをイベント ログに保持し、メモリに格納されたモデルにすべてのイベントの集約状態を保持します。クエリはすべてこのモデルに反しており、キャッシュと見なすことができます。
例
新しいユーザーの作成:
- ユーザーがモデルに存在しないことを検証する
- イベントをジャーナルに永続化する
- モデルの更新 (メモリ内)
ステップ 3 が中断された場合でも、イベントを保持しているので、後で再生できます。ステップ 2 が壊れた場合は、それも適切に処理できます。
これは問題ありませんが、ステップ 2 は I/O バウンドであるため、別のアクターで I/O を実行して、最初のアクターをクエリ用に解放する必要があると考えました。
クエリを許可しながらユーザーを更新する (A0 = フロント エンド/GUI アクター、A1 = プロセッサ アクター、A2 = IO アクター、E = イベント バス)。
- (A0->E->A1) ユーザー 'U1' を更新するイベントが発行されます。ユーザー「U1」がモデルに存在することを検証します
- (A1->A2) イベントをジャーナルに永続化 (別のアクター)
- (A0->E->A1->A0) ユーザー 'U1' プロファイルのクエリ
- (A2->A1) イベントが永続化され、モデルの更新を続行
- (A0->E->A1->A0) ユーザー 'U1' プロファイルのクエリ (新しいデータが返されるようになりました)
I/O が独自のペースで変化している間にクエリを処理できるため、これは魅力的です。
しかし、イベントを永続化する前に検証を行っているため、互換性のない 2 つのコマンド (削除してから更新) がイベント ログに永続化され、後で再生するとクラッシュする可能性があるという、あらゆる種類の問題を自分自身で引き起こす可能性があります。その後、モデルを更新します。
私の目的は、(アクターがメッセージをシングル スレッドで順次処理するため) モデルについて単純な推論を行うことですが、クエリ時に I/O バウンドの更新を待機しないようにすることです。データベースをモデリングしているように感じますが、それ自体が問題になる可能性があります。
不明な点がある場合は、コメントを書いてください。
unit-testing - CommonDomain - 集計ルートを単体テストする方法
Jonathan Oliver のCommonDomainとEventStoreを使用する小さなシステムがあります。
正しいイベントが発生することを確認するために、集約ルートを単体テストするにはどうすればよいですか?
次の集約ルートを検討してください。
次のテストを書きたいと思います。
メモリ永続性と同期ディスパッチャーを使用して EventStore 全体をセットアップし、モック イベント ハンドラーを接続して、発行されたイベントを検証用に保存することもできますが、少しやり過ぎに思えます。
IRouteEventsCommonDomain にはインターフェースがあります。イベントを直接取得するためにモックできるように見えますが、AggregateBase実際にSubscriberクラスに渡すにはどうすればよいでしょうか? ドミアンをテスト関連のコードで「汚染」したくありません。
transactions - CQRS: イベントの保存と公開 - これを安全に行うにはどうすればよいですか?
イベント ストアではなく、CQRS リポジトリがイベントを発行するのはなぜですか? で学んだように。イベントを発行するのは、CQRS リポジトリのタスクです。ここまでは順調ですね。
もちろん、イベントの保存と発行は、1 つのトランザクション内で行う必要があります。技術的には、これは 1 つ (または複数) のレコードをストアに書き込み、1 つ (または複数) のイベントをメッセージ バスに発行することを意味します。したがって、単純なデータベース トランザクションでは十分ではなく、分散トランザクションにする必要があります。
現在、残念ながら、多くの NoSQL データベース (MongoDB など) は ACID 準拠のトランザクションをサポートしておらず、分散トランザクションで発生する可能性についても言及していません。さらに、分散トランザクションをサポートしていないメッセージ キューもあります。
問題は、これにどう対処するかです。
使用する推奨パターンはありますか?
domain-driven-design - CQRS/イベント ソーシング、一貫したデータを取得してビジネス ルールを適用するにはどうすればよいですか?
時々、CQRS パターンとイベント ソーシングを使用して小さなプロジェクトを開発しています。構造的な問題があり、それを解決するためにどのソリューションを使用すればよいかわかりません。
次の例を想像してください。銀行のクライアントがいくらかの金額を入金したという情報を含むコマンドが送信されます (DepositCommand)。コマンド ハンドラー/エンティティ/集約 (議論には重要ではありません) では、ビジネス ルールを適用する必要があります。クライアントが上位 10% の 1 人で、アカウントの資金が多い場合は、賞金を獲得できます。
問題は、入金後のクライアントが上位 10% に入っているかどうかを知るために、どうすれば最新の一貫したデータを入手できるかということです。
- このようなクエリを作成できないため、イベント ストアを使用できません。
- 読み取りモデルが最新であると 100% 確信していないため、使用できるかどうかはわかりません。
ビジネス ルールを適用するためにデータベースからのデータが必要な場合、どうしますか? 最新のデータに注意を払わないと、2 つの異なるクライアントに賞品を与える可能性があります
ご意見をお待ちしております。
cqrs - EventStore:使い方を学ぶ
私はEventStoreを学ぼうとしています。コンセプトは気に入っていますが、実際に適用しようとすると、同じ点で行き詰まります。コードを見てみましょう:
それについての2つの質問:
メンテナンス後にアプリが起動した場合、どのイベントが読み取りを開始するかを安全な方法でブックマークするにはどうすればよいですか?使用するパターンはありますか?
イベントがすべて消費されるとすぐに、サイクルは終了します...実行時に到着するメッセージはどうですか?新しいメッセージが到着するまで(もちろんスレッドで処理する必要があります)、またはBeginRead EndReadのようなものが表示されるまで、呼び出しがブロックされることを期待します。
ランタイムイベントを処理するためにESBをバインドする必要がありますか、それともEventSoreはこれを行うための機能を提供しますか?
例を挙げて説明しようと思います 集計が金融ポートフォリオであり、アプリケーションがそのポートフォリオをトレーダーに示すアプリケーションであるとします。トレーダーがWebアプリに接続し、自分のポートフォリオを調べたとします。現在の状態は履歴全体になるので、状態を再現するために潜在的に多くのレコードを読み取る必要があります。これはいわゆるスナップショットで実行できると思いますが、作成の責任者は誰ですか?いつ集合体を作成することを選択する必要がありますか?集合体のスナップショットが存在することをどのように推測できますか?ランタイム部分の場合:ユーザーが再構築されたポートフォリオの状態を確認するとすぐに、リアルタイム部分の実行が開始されます。ユーザーは注文を行うことができ、市場でその注文を正常に実行することで新しいポジションを作成できます。ポートフォリオはインフラストラクチャによってどのように更新されますか?私は期待しますが、多分私は完全に間違っています同じイベントストリームがその新しいイベントのソースであり、新しいロングポジションです。それ以外の場合は、同じアグリゲートの状態を処理する2つのパスがあります。これが戦略がどのように機能するかを知りたいのですが、2つの州のエージェントがいるのは少し難しいと感じても、重複する可能性があります。重複をどのように恐れているかを明確にするために:
- イベントはべき等でなければならないことを知っているので、とにかく問題ではないはずです、
- しかし、次のことを考えてみましょう。
イベントをストリーミングする前にイベントバスをサブスクライブして、ポートフォリオの状態を更新します。いくつかの「オープンポジションイベント」がバスに表示されます。私はそれらを処理する必要がありますが、ポートフォリオはまだ実現されていないため、処理するための正しい状態ではない可能性があります。そのようなイベントを処理できたとしても、ストリームを読むと再びそれらを見つけることができます。
もっと陰湿です:私はストリームを開き、すべてのイベントを読み、状態を作成します。次に、バスをサブスクライブします。ステラムの読み取りが終了してからサブスクリプションが開始されるまでの途中で、バス上のメッセージが発生します。これらのイベントが欠落しており、集計が正しい状態ではありません。
すべて我慢してください、私の英語は貧弱で、議論はトリッキーです、私が私の疑問を共有することができたことを願っています:)
logging - Wicketでのユーザーアクションの記録
Wicketとイベントソーシングを試しています。ユーザーアクションをログに記録しようとしているので、それらを再生したり、テストやデモの目的で使用したりできます。
戦略として何をお勧めしますか?
たとえば、アクションクラスを定義して、onsubmitなどに配置できます。または、リンク、ボタン、テキストフィールドなど、ウィケットのすべての「アクション」コンポーネントをオーバーライドできます。等。
何か良いアドバイスはありますか?
distributed-computing - パブリッシャーの後にオンラインになったときにサブスクライバー データをシードする
2 つのビジネス コンポーネントがあるとします。
- ユーザー管理
これはユーザーを所有しています。ユーザー情報が変更されると、このコンポーネントはメッセージを発行します。たとえば、「NewUserCreated」
- 出版物
ユーザーとのやり取りを処理します。電子メール、ツイートなど。したがって、このコンポーネントはユーザー メッセージをサブスクライブし、その情報のサブセットを独自のストアに格納します。
問題
User Management コンポーネントが Publications コンポーネントの前にオンラインになるとどうなりますか? Publications はどのようにして既存のユーザーのリストを取得しますか? ユーザー管理コンポーネントがそのデータをどのように保存するかを認識しないでください。