問題タブ [neventstore]
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.
unit-testing - CommonDomain - 集計ルートを単体テストする方法
Jonathan Oliver のCommonDomainとEventStoreを使用する小さなシステムがあります。
正しいイベントが発生することを確認するために、集約ルートを単体テストするにはどうすればよいですか?
次の集約ルートを検討してください。
次のテストを書きたいと思います。
メモリ永続性と同期ディスパッチャーを使用して EventStore 全体をセットアップし、モック イベント ハンドラーを接続して、発行されたイベントを検証用に保存することもできますが、少しやり過ぎに思えます。
IRouteEvents
CommonDomain にはインターフェースがあります。イベントを直接取得するためにモックできるように見えますが、AggregateBase
実際にSubscriber
クラスに渡すにはどうすればよいでしょうか? ドミアンをテスト関連のコードで「汚染」したくありません。
transactions - CQRS: イベントの保存と公開 - これを安全に行うにはどうすればよいですか?
イベント ストアではなく、CQRS リポジトリがイベントを発行するのはなぜですか? で学んだように。イベントを発行するのは、CQRS リポジトリのタスクです。ここまでは順調ですね。
もちろん、イベントの保存と発行は、1 つのトランザクション内で行う必要があります。技術的には、これは 1 つ (または複数) のレコードをストアに書き込み、1 つ (または複数) のイベントをメッセージ バスに発行することを意味します。したがって、単純なデータベース トランザクションでは十分ではなく、分散トランザクションにする必要があります。
現在、残念ながら、多くの NoSQL データベース (MongoDB など) は ACID 準拠のトランザクションをサポートしておらず、分散トランザクションで発生する可能性についても言及していません。さらに、分散トランザクションをサポートしていないメッセージ キューもあります。
問題は、これにどう対処するかです。
使用する推奨パターンはありますか?
design-patterns - EventStoreとアプリケーションのライフサイクル
この質問はばかげているかもしれませんが、私は少し混乱しています。このパターンを活用したいとします。
エンタープライズアプリケーションのイベントストレージスコープは正確には何ですか?
イベントストレージは複数のプロセス間で共有されますか、それとも単なるインプロセスの概念ですか?
アプリケーションを閉じると、イベントはどうなりますか?それらはアプリケーションの「インスタンス」にバインドされていますか、それともアプリケーションにバインドされていますか?
イベントストレージとパブリッシャー/サブスクライバーを使用したMessageBusの違いは何ですか(メッセージ履歴を保存できるという事実の一部ですか?
メッセージのべき等の責任者は誰ですか?
- この文の実際の意味:「興味深いことに、メッセージキューや永続ストレージなど、関連するさまざまなリソースに分散トランザクションが存在しなくても、EventStoreは完全なトランザクションエクスペリエンスを保証できます。これは、分解することで実現されます。分散トランザクションをより小さな部分に分割し、それぞれを個別に実行する」(このプロジェクトから)すべてがトランザクションであるとしても、トランザクションをいくつかの小さな部分に分割すること自体が分散トランザクションを置き換えることができる方法を理解できません。
cqrs - EventStore:使い方を学ぶ
私はEventStoreを学ぼうとしています。コンセプトは気に入っていますが、実際に適用しようとすると、同じ点で行き詰まります。コードを見てみましょう:
それについての2つの質問:
メンテナンス後にアプリが起動した場合、どのイベントが読み取りを開始するかを安全な方法でブックマークするにはどうすればよいですか?使用するパターンはありますか?
イベントがすべて消費されるとすぐに、サイクルは終了します...実行時に到着するメッセージはどうですか?新しいメッセージが到着するまで(もちろんスレッドで処理する必要があります)、またはBeginRead EndReadのようなものが表示されるまで、呼び出しがブロックされることを期待します。
ランタイムイベントを処理するためにESBをバインドする必要がありますか、それともEventSoreはこれを行うための機能を提供しますか?
例を挙げて説明しようと思います 集計が金融ポートフォリオであり、アプリケーションがそのポートフォリオをトレーダーに示すアプリケーションであるとします。トレーダーがWebアプリに接続し、自分のポートフォリオを調べたとします。現在の状態は履歴全体になるので、状態を再現するために潜在的に多くのレコードを読み取る必要があります。これはいわゆるスナップショットで実行できると思いますが、作成の責任者は誰ですか?いつ集合体を作成することを選択する必要がありますか?集合体のスナップショットが存在することをどのように推測できますか?ランタイム部分の場合:ユーザーが再構築されたポートフォリオの状態を確認するとすぐに、リアルタイム部分の実行が開始されます。ユーザーは注文を行うことができ、市場でその注文を正常に実行することで新しいポジションを作成できます。ポートフォリオはインフラストラクチャによってどのように更新されますか?私は期待しますが、多分私は完全に間違っています同じイベントストリームがその新しいイベントのソースであり、新しいロングポジションです。それ以外の場合は、同じアグリゲートの状態を処理する2つのパスがあります。これが戦略がどのように機能するかを知りたいのですが、2つの州のエージェントがいるのは少し難しいと感じても、重複する可能性があります。重複をどのように恐れているかを明確にするために:
- イベントはべき等でなければならないことを知っているので、とにかく問題ではないはずです、
- しかし、次のことを考えてみましょう。
イベントをストリーミングする前にイベントバスをサブスクライブして、ポートフォリオの状態を更新します。いくつかの「オープンポジションイベント」がバスに表示されます。私はそれらを処理する必要がありますが、ポートフォリオはまだ実現されていないため、処理するための正しい状態ではない可能性があります。そのようなイベントを処理できたとしても、ストリームを読むと再びそれらを見つけることができます。
もっと陰湿です:私はストリームを開き、すべてのイベントを読み、状態を作成します。次に、バスをサブスクライブします。ステラムの読み取りが終了してからサブスクリプションが開始されるまでの途中で、バス上のメッセージが発生します。これらのイベントが欠落しており、集計が正しい状態ではありません。
すべて我慢してください、私の英語は貧弱で、議論はトリッキーです、私が私の疑問を共有することができたことを願っています:)
neventstore - Jonathan Oliver の EventStore クエリとプロジェクション
Jonathan Oliver は、彼の EventStore 実装に関するスクリーキャスト プレゼンテーションで、イベントをクエリする機能、たとえば複雑な一時クエリを作成する機能について言及しました。私が理解していることから、これは読み取りモデルを更新するか、イベントストアが更新された後にプロジェクションを作成することによって行われますが、JO の実装を使用した例は見当たりません。へのリンクや例は素晴らしいでしょう!
cqrs - NEventStoreで同じ集約ルートで作業している2人のユーザー
コマンドが失敗してはならないことはわかっているので、コマンドを送信する前にコマンドを検証する必要があります。
ただし、2人のユーザーが同じ集約ルートを更新していて、両方が有効であると思われる場合は、同時実行の問題が発生します。
NEventStoreでこれを処理するにはどうすればよいですか?クライアントは、イベントの保存時に渡すバージョン番号またはコミットIDを取得する必要がありますか?それが変更された場合は、例外を発生させますか?
domain-driven-design - DDD: 継承とトランザクション
ドメイン駆動設計とイベント ソーシングを試しています。それらをバインドするために、NServiceBus、JOliver の EventStore、および NES を使用 (C# で開発) する予定です。単純なケース (値オブジェクトのみを持つ 1 つの集約ルート) で機能するインフラストラクチャが既にあります。
私は Evans のブルーブックを読んでいて、私の仕事の分野 (HVAC メンテナンス会社の ERP と CRM) から例を挙げて、単純なドメイン モデルを開発しようとしています。
私は単純なサブドメイン、つまり HVAC マシンとそれらの間の関係をモデル化しています。機械には、炉、バーナー、エアコン、コンプレッサー、汎用コンポーネントなど、さまざまな種類があります。各マシンは、複数の子マシンを持つことができます。すべてのマシン タイプは、いくつかの共通のデータといくつかの共通の動作を共有します。ただし、各タイプには追加のデータと特定の動作があります。たとえば、Burner オブジェクトは Furnace にのみ追加できます。
私の分析の最初の結果は、特定のマシンへの参照を保持できる必要があるため (たとえば、単一のマシンを含む修理記録の挿入、障害の記録、など)、また、大規模なマシン ツリーでの同時実行の問題を軽減します。
したがって、私の仮説は次のとおりです。
しかし、私はいくつかの疑問があります:
これは私のドメインを表す正しい方法ですか? クラスの継承が推奨されていないことを読みましたが、これはそれを使用するのに最適なケースのようです (バーナーはマシンであり、ファーネスもそうです)。継承は 1 レベルに制限します。
イベントソーシングでクラス継承を実装することは可能ですか? 特に提案された技術スタック (nServiceBus、EventStore、NES) では?
子マシン (炉へのバーナーなど) の追加はどのように実行すればよいですか? この操作は次の 2 つに分けられます。
- 新しいバーナーをバーナー リポジトリに追加します。
- 親炉のバーナー リストにバーナーへの参照を追加しますが、これら 2 つの操作は 2 つの集約ルートをグローバルに変更するため、操作は 2 つの別個のコマンド ハンドラー/トランザクションで実行する必要があります... しかし、2 つ目は最初のものに依存します...これはモデリングエラーの証拠ですか?nServicebusMessages を一緒にバッチ処理して、単一のトランザクションでアクションを実行することもできますが、これは良くないことを読みました...
子マシンが親を参照するようにすると、親は (検証に必要な) 子マシンのリストを失い、Guid 以外のプロパティのイベント ソーシング リポジトリを照会できません。
ディスカッションへの貢献に感謝します。
c# - joliver / EventStore の結果整合性
イベント ストレージと読み取りモデルが実際のナットとボルトの実装に関してどのように関連しているかを理解しようとしています。
イベント ストアについての理解が限られているため、次のように考えています。
- イベントはイベント ストアにコミットされます
- Dispatcher の実行
- キューを使用している場合は、メッセージをキューに送信します (大量輸送としましょう)。
- 私の読み取りモデルはキューにサブスクライブされているため、読み取りデータベースはメッセージを取得します (mysql)
- データへの新しい変更で読み取りモデルが更新されます
これは、大量輸送機関に何かが起こった場合、私の読み取りデータベースが同期されなくなり、それを同期する方法を見つけなければならないことを意味します.
greg young によって公開された、私が読んだり見たりしたものの中には、イベント ストア自体をキューとして使用し、イベント ストア側で自動インクリメント番号を保持して一貫性を維持することを提案しているものがあります。それがjoliverのプロジェクトに実装されているのだろうか?
cqrs - EventStore でのコミット エラー
Jonathon Oliver の EventStore で次のエラーが表示されます。
エラー: 23505: 重複するキー値が一意の制約 "ix_commits_revisions" に違反しています
なぜこれが起こっているのですか?