問題タブ [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.
design-patterns - オブジェクトのバージョン管理を行うためのいくつかのデザインパターンは何ですか?
オブジェクトの変更時にオブジェクトの履歴を保持するためのいくつかのデザインパターンは何ですか。イベントソーシングほど強力なものは必要ありません。特定のイベントが発生したとき(この場合はフォームの印刷ボタンが押されたとき)に過去のバージョンを保存する機能だけが必要です。
domain-driven-design - CQRS + DDD + イベント ソーシングでの集約間通信
イベントソースの集約バックエンドを使用して、DDD 原則に基づいて構築された環境で、個別の集約ルート(AR) が互いにどのように通信する必要がありますか?
たとえばFacility
、AR の作成を担当するファクトリ メソッドを持つ集約ルート (AR) がありBooking
ます。はBooking
、時間に依存するPerson
AR と ARの組み合わせですFacility
。APerson
は単品でのみ予約可能Facility
です。
Booking
DDD では、 inPerson
とPerson
inへの参照を保持していたでしょうFacility
。ただし、イベント ソーシングで使用するイベントを生成する場合、バックエンドからイベントの逆シリアル化を処理しようとすると、法外になると思います。したがって、値オブジェクトベースの一意の ID への参照のみを保持することにしました。ただし、AR のメソッドが別の AR の別のメソッドを呼び出す必要がある場合、これは新しい問題を引き起こします。その状況をどのように処理しますか? ドメイン AR からイベント ソース リポジトリにアクセスしますか?
このシナリオの一般的な使用例は何ですか? 私はこれにすべて間違って近づいていますか?
c# - CQRS - ページまたはクエリを表示しているユーザーを処理する方法
構築中のアプリケーション (複雑なビジネス ロジックを備えたオンライン ディスカッション システム) に CQRS を使用していますが、実装で気になる部分に到達しました。
ページビューをどのように処理すればよいですか? ユーザーがスレッドを表示した場合、それを追跡したいと思います。それを追跡したいので、コマンドとイベントを作成し、これを、表示しているオブジェクト (たとえば、それぞれ UserViewsThread と UserViewedThread) を担当する集約ルートに結び付ける必要があります。しかし、これは非常に非効率的であるように思われます。これ以外に、ディスカッション システム (フォーラム/スレッドの表示) の多くのユース ケースで集約ルートに到達する理由はありません。これを導入したので、ページのすべてのビューで追加のコマンド ディスパッチとイベント パブリッシュを行います。これは、スレッド集約の「スプールアップ」、イベントのシリアル化、およびイベントへの送信を担当します。出版社。
これを行うためのより良い方法が必要です。おそらく、コントローラー オブジェクトがイベントをディスパッチできるようにすることを考えていましたが、集約をバイパスすることで、動作をページビューに関連付けることができなくなりました。
もう 1 つの可能性は、ユーザーを認証する方法としてこれを使用するという考えです。UserViewsThread および UserViewsForum コマンドは、認証例外をスローして、ユーザーがこのアクションを実行できないことをコントローラーに知らせることができます。しかし、これらがイベントに変換され、私のイベント ストアに格納された場合、ページ ビューごとに作成された複数のイベントについて話していることになります。これは、パフォーマンスを非常に損なう可能性があります (ページ ビューごとにデータベース トランザクションが発生します...うーん)。そしてリソース管理。
あなたの彼の考えは何ですか?
domain-driven-design - Domain Events と ServiceBus で CQRS と DDD を使用する場合の View での変更の表示
ドメイン イベントを使用して読み取りモデルを構築するシステムのフローについて、少し混乱しています。特に、ユーザーがコマンドを完了したときにデータ (およびそのビュー) が変更されることを期待しているにもかかわらず、システム アーキテクチャ (イベントを発行するための非ブロック呼び出し) により、実際のデータベースは変更前に変更されない可能性があるという事実にどのように対処すればよいでしょうか。ページがリロードされますか?
イベントとサービス バスを使用して、システムの 1 つの設計を CQRS とより一致させたいと考えています。
私のフローが次のようになるとしましょう:
ユーザーはビューのボタンをクリックして、アカウントから支払い方法を削除するタスクを実行します。
コントローラーは PaymentMethodRemovalService を呼び出し、accountId と paymentMethodId を渡します。
コントローラーは AccountRepository を使用してアカウントを取得し、account.RemovePaymentMethod(id) を呼び出します
アカウントは操作が実行できることを検証し、イベント PaymentMethodRemovedMessage(accountId, paymentMethodId) を発行します
イベント発行は非同期であるため、サービスから戻り、コントローラーからビューを返す必要がありますが、実際のデータはまだ更新されていません。
ハンドラー IHandle< PaymentMethodRemovedMessage > がイベントを受け取り、DB から実際の行を削除します。
それで、男は何をするのですか?
たとえば、支払い方法を表示していた div を削除するだけです。これは AJAX シナリオで機能する可能性がありますが、JavaScript 以外のクライアントをサポートするために Post-Redirect-Get を使用している場合はどうでしょう。次に、おそらく更新される前に、Get を起動し、Query 側からデータを読み取ります。
支払い方法を削除するリクエストが送信されたことを示す通知を表示するだけですか? (友好的ではないように見えますが、注文を送信するのには意味がありますが、住所の変更などには意味がありません)。
変更を分離された非同期イベントとして実装し、現在の変更を反映するユーザー データを表示する方法はありますか?
編集:私の質問はCQRS、DDD同期レポートデータベース に非常に似ています。そこに与えられた答えとここでほのめかされた答えには、少し臭いがあります-帯域外の更新を表示するためにUIを混乱させますいわば読み取りDBです。私はもう少しきれいなものを望んでいました。
domain-driven-design - イベント ソーシングと読み取りモデルの生成
スタック オーバーフロー ドメインの問題と、次のイベントの定義を想定します。
イベント ストアの状態を次のように仮定します (出現順)。
質問リスト (SO の最初のページ) の次の非正規化読み取りモデルを想定します。
そして、次のイベント ハンドラー (非正規化された読み取りモデルを構築します):
私の質問は、質問をしたユーザーの名前を見つけるにはどうすればよいですか? または、より一般的な: 非正規化された読み取りモデルが特定のイベントに存在しない追加データを必要とする場合、イベントをどのように処理すればよいですか?
Greg Young の SimpleSQRS やMark Nijhof のFohjinサンプルなど、 CQRSの既存のサンプルを調べました。しかし、それらはイベントに含まれるデータのみで動作しているように思えます。
cqrs - 読み取りモデルがイベントログと同期しなくなった場合の状況の処理方法は?
アグリゲートのスナップショットがイベントログと同期しなくなった場合、初期のスナップショット(同期しているはずです)からイベントを簡単に再生できます。新しいフィールドを追加/削除するとき、または既存のハンドラーのロジックを変更するときにも同じことができます。
新しい読み取りモデル(つまり、新しいレポートビュー)を追加する必要がある場合は、同じことを再度実行できます。イベントを再生します。
しかし、読み取りモデルがイベントログと同期しなくなった場合、どのように状況を処理する必要がありますか?イベントの保存と公開は1つのトランザクションで行われますが、読み取りモデルの更新は別のトランザクションで発生したため、失敗する可能性があります。最初からイベントを繰り返すことは役に立ちますが、永遠にかかる可能性があります。読み取りモデル全体のスナップショットの概念が必要ですか?
この問題をどのように解決しますか?ありがとうございました。
cqrs - イベントソーシングと辞書オブジェクト
イベントソーシングを、、などのいくつかのタイプのディクショナリオブジェクトCountry
、または定義などの特定のドメインモデルのディクショナリタイプと組み合わせる方法。一部のディクショナリオブジェクトは管理UIで編集できるはずですが、そうでないものもあります。Region
Time Zone
Budget
Availability
たとえば、国の管理UIは必要ないと判断しました。AddCountry
したがって、 /RemoveCountry
コマンドを実装する必要はありません。
イベントのセットを生成するCountryAdded
必要がありますか、つまり、辞書オブジェクトをイベントのストリームとして永続化する必要がありますか?イベントストリーム以外に信頼できる情報源を使用したことはありますか?
辞書オブジェクトのイベントストリームなしで移動できる場合、この問題をどのように解決しますか?
国のリストと各国のユーザー数を表示します。
この場合、イベントCountry
のリスナーを使用して、読み取りモデル内のオブジェクトを表現する必要があります。UserAdded
ありがとうございました。
cqrs - ビューモデルを準備するときに2つの集約ルートを「結合」する方法は?
とが私のモデルの集合ルートであるBook
と仮定します。Author
AuthorsAndBooks
読み取りモデルでは、著者と書籍のリストであるテーブルがあります。Book.AuthorId
イベントが発生したときに、新しい行を作成するためのデータBookAdded
を受信したいと思います。Author
AuthorsAndBooks
は集約ルートであるためBook
、に関する情報はイベントAuthor
に含まれません。また、 rootにはゲッターがないため(CQRSとイベントソーシングに関するすべての例と投稿のガイドラインによる)、これをBookAdded
含めることはできません。Author
通常、私はこの質問に対して2種類の回答を受け取ります。
- イベントハンドラーで必要なすべてのデータでドメインイベントを強化します。しかし、私が言ったように、私はAggregatesRootsに対してそれを行うことはできません。
- ビューモデルから利用可能なデータを使用します。
Author
つまり、ビューモデルからロードし、それを使用してAuthorsAndBooks
行を作成します。
最後のものには、並行性に関するいくつかの問題があります。BookAdded
イベントの処理中は、作成者データをビューモデルで使用できません。
これを解決するためにどのようなアプローチを使用しますか?ありがとうございました。
design-patterns - CQRS+イベントソーシングアーキテクチャでViewModelの変更を管理する方法
現在、CQRSとイベントソーシングアーキテクチャを評価しています。この種の設計を使用することのメンテナンスへの影響が何であるかを理解しようとしています。私が答えを見つけるのに苦労している2つの質問はこれです:
1)アプリケーションが起動してしばらく実行された後、ReadModelデータベースのViewModelにフィールドを追加する新しい要件がある場合はどうなりますか?たとえば、CustomerList ViewModelには顧客の郵便番号が必要ですが、以前は必要ありませんでした。したがって、追加の列はViewModelデータベースに簡単に追加できますが、これはどのように入力されますか?私が見る限り、唯一の方法は、読み取りデータベースをクリアし、すべてのイベントを最初から再生して、ReadModelDatbaseを構築することです。しかし、アプリケーションが数か月または数年にわたって稼働している場合はどうなりますか(私たちが望むように)。これは、郵便番号列のデータを追加するためだけに、何百万ものイベントを再生する可能性があります。
技術的な理由でReadModelデータベースが同期しなくなった場合、または新しいReadModelデータベースを追加したい場合も、同じ懸念があります。アプリケーションが古く、使用するほど、最新のreadmodelを元に戻すのは難しく、費用もかかるようです。それとも私はどこかでトリックを逃していますか?ReadModelスナップショットのようなものですか?
2)読み取りデータベースをバックアップするために何百万ものイベントがすべて再生された後、一部のデータが期待されたものと一致しない場合(つまり、見た目が間違っている場合)はどうなりますか。おそらく、イベントの保存または非正規化ルーチンのどこかにバグが原因である可能性があります(コーディングで信頼できることが1つあるとすれば、それはバグのようです)。これをデバッグする方法!それは不可能な仕事のようです。または多分、もう一度、私はトリックを逃しています。
このようなシステムをしばらく実行している人から、メンテナンスとアップグレードのパスがどのように機能したかを聞いてみたいと思います。
いつでもご入力いただきありがとうございます。
.net - CQRS + EventSourcing のスケーラビリティ
新しいプロジェクトで CQRS と EventSorcing を使用しようとしています。私は、Greg Young が数年前に提案した方法に従っています (Mark Nijhof の実装 - http://cre8ivethought.com/blog/2009/11/12/cqrs--la-greg-young/ )。また、このソリューションのスケーラビリティに関していくつかの問題があります。
この中でいくつかの点が言及されたマーク・ナイホフの記事。しかし、現在の問題は、レポート データベースの更新を担当する Denormalizer 部分です。この部分は非同期にしたいので、バスにイベントを発行したらすぐに制御を戻したいです。Denormalizer をスタンドアロンの Web サービス (WCF) として実装し、受信イベントを処理し、コマンドのバッチでタイミングを合わせてレポート データベースを更新することを提案しました。これがボトルネックになる可能性があるため、この時点である程度のスケーラビリティも追加したいと考えています - クラスタ ソリューションです。しかし、クラスターの場合、レポート データベースの更新のシーケンスを制御することはできません (または、レポート DB でオブジェクトのバージョンをチェックする、いくつかの奇妙でバグのあるロジックを実装する必要があります)。もう 1 つの問題は、ソリューションの持続可能性です。失敗した場合、どこにも永続化しない限り、デノーマライザーで更新が失われます)。だから今、私はこの問題(デノーマライザーのスケーラビリティ)の解決策を探しています。どんな考えでも大歓迎です!