問題タブ [cqrs]

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.

0 投票する
2 に答える
1161 参照

cqrs - JOliver EventStore スナップショット

このコードがあるとします:

現在のストリームにロードする集計をどのように知ることができますか? CommonDomain も使用しています。そこに何かありますか?

ありがとう

0 投票する
2 に答える
3805 参照

email - CQRS とドメイン駆動設計を使用して電子メールまたは SMS を送信する

現時点では、CQRS とドメイン駆動設計の原則に基づく新しいアーキテクチャを構築しています。現在、外部とのコミュニケーションをどのように扱うべきかについて議論を行っています。質問をより具体的にするために、顧客が注文を作成したときに SMS 通知を送信する例を使用します。

クライアントは、関連付けられたコマンド ハンドラーによって処理される NewOrderCommand を作成します。ハンドラーは、ドメイン モデルに新しい Order オブジェクトを作成し、NewcustomerCreatedEvent を生成します。オブジェクトはイベント ストアに保存され、イベントはすべてのリスナーに発行されます。

ここまでは順調ですが、ここで質問です。SMS 通知はどこに送信すればよいですか?

私たちの最初の本能は、NewCustomerCreatedEvent をリッスンしてメッセージを送信するイベント リスナーを使用して送信する必要があることを教えてくれました。このアプローチの問題点は、SMS の送信もビジネス ロジックの一部であることです。私たちはホストされたサービスを販売しているので、クライアントは彼らに代わって送信されたすべての SMS メッセージを見ることができるはずです. メッセージの送信はドメイン外で行われるため、それを行うことはできません。

SMS ドメインを作成し、イベント リスナーが NewCustomerCreatedEvent を受け取ると、イベント ハンドラーが新しいコマンド SendSmsMessageCommand を作成します。このコマンドは、ドメイン内に新しい SMSMessage オブジェクトを作成し、SMS 通知を送信して、SmsSent イベントを作成します。見る。

最初はドメイン モデルで SMS メッセージを送信していましたが、これが問題を引き起こす可能性があることに気付きました。SMS の送信後に何かが発生し (例外がスローされ)、トランザクションがロールバックされたとします。私たちのドメインはこれを完全にサポートしているため、データに関しては問題ありませんが、SMS メッセージは既に送信されているため、コマンドが再送信されると、SMS 通知が再度送信されます。

SmSSent イベントで SMS を送信することを考えていましたが、それは少し奇妙です。イベントは、メッセージが既に送信されたと言っているのに、まだ送信されていないからです。

上記の例から、CQRS とドメイン駆動設計の概念で外部通信をどのように処理するかという疑問が生じます。SMS 通知の送信だけでなく、請求書の送信、外部請求システム、および外部世界へのその他すべての種類の通信についても話しています。これはビジネス ロジックであるため、ドメインで行うべきでしょうか、それともイベント ハンドラーのイベントに基づいて常に行うべきでしょうか? また、そうする場合、メッセージがまだ実際に送信されていないときにメッセージが送信されたことを示すイベントを使用することは許容されますか?

皆さんがすでにこの状況に対処しており、この件についてアドバイスをいただけることを願っています。

0 投票する
1 に答える
338 参照

import - NService Bus を使用したデータのインポート

NService バスの使用。2.00.19 (MSMQ および SQL 2008 を使用)

システムにデータをインポートしたいと考えています。
ファイルは非常に大きくなる可能性があるため、バスからメッセージを読み取るバックグラウンド プロセッサがあります。この処理には 1 時間かかる場合があります。

他の人はこれをしましたか?佐賀は前進する最善の方法ですか?

0 投票する
3 に答える
2236 参照

cqrs - リレーショナルデータのイベントストアへの移行

私は、CQRSパターンの独自の実装を使用して、古いプロジェクトをCQRSに移行しています。この移行を開始した主な理由は、n層アーキテクチャが引き起こした混乱を取り除くためでした。ただし、このプロジェクトは、他の多くのプロジェクトと同様に、リレーショナルデータストアを使用しています。

このプロセスの現在の状態は、変更を加えるコマンドとクエリを分離するクエリオブジェクトがあることです。つまり、クライアントからサーバーへの変更からのイベントを公開したり、非正規化された読み取りストアを使用したりすることはありませんが、データを変更およびクエリするCQRS風の方法があります。私の「ドメインモデル」として、かなり貧血のDTOもあります。すべての動作は、ハンドラー、マネージャー、およびそれらすべての恐ろしいレイヤーのものとともに、n層レイヤー全体に分散されていました。

次のステップに進む方法を知りたいです。私が今望んでいるのは、その動作を担当するドメインモデルの構築を開始することです。その理由は、信頼できる唯一の情報源としてイベントストアを使用し始めたいということです。

リレーションデータストアからイベントストアにデータを移行するにはどうすればよいですか?

移行する必要のある非常に重要なデータを含む、非常に正規化されたデータモデルがあります。データが死んでいるため、そのデータから意図をキャプチャすることは期待できないことは理解していますが、どうすればよいですか?大量の移行コマンドを作成する必要がありますか?これからあなたの経験を聞くのは素晴らしいことです。

0 投票する
1 に答える
481 参照

cqrs - CQRSを使用して読み取りデータベースの重複値を装うにはどうすればよいですか?

ReadDatabaseにUserテーブルがあるとします(SQL Serverを使用)。通常の読み取り/書き込みデータベースでは、2人のユーザーが同じ電子メールアドレスでテーブルに追加されないように、テーブルにインデックスのように配置できます。

したがって、別のユーザーのテーブルにすでに存在するemailadressを持つユーザーを追加しようとすると、SQLサーバーは例外をスローします。

Cqrsでは、readdatabasへの書き込みをドメインモデルから切り離すと、非同期キューに配置することで例外が返されなくなり、UIに「OK」を返します。ユーザーは、自分がデータベースに追加されたと思いますが、実際には、読み取りデータベースに追加されることはありません。

読み取りデータベースで検索を実行して、emailadressを使用してデータベースに既にユーザーが存在するかどうかを確認し、存在する場合は、例外を介してUIに戻ります。しかし、彼らが同時に保存ボタンを押した場合、データベースに対して2つのチェックを行い、データベースにemailadressを持つユーザーがいないことを確認し、問題がないことを返信します。それを私のキューに入れて、後で失敗します(一意の識別子をヒットすることによって)。

EventSource(SQL Server)からすべてのユーザーをロードし、そのコレクションをチェックして、このメールアドレスを既に持っているユーザーがいるかどうかを確認することを想定していますか?それは私も少しクレイジーに聞こえます...

どのように人々はそれを解決しましたか?

私が見ることができる方法は、非同期キューを使用せず、同期キューを使用することですが、特に書き込み先の「読み取りストレージ」が多数ある場合は、パフォーマンスに非常に悪い影響を及ぼします...

ここで助けが必要です...

0 投票する
1 に答える
537 参照

silverlight - Silverlight からの RavenDb のクエリ

構築中の 1 つの Silverlight アプリケーションのアーキテクチャと設計について決定する必要があります。アプリは要件/問題追跡用です。
要件:

  • SL4
  • ASP.NET (MVC)
  • 完全信頼の共有ホスティング環境、IIS7

私はを頂きたい:

  • CQS (CQRS) スタイルの分離、クエリ、およびコマンド
  • 1 つのデータベース、「実際の」CQRS のように 2 つのストレージは必要ありません。競合状態もスケーリングの問題もありません。RavenDbが使えたらいいのに
  • コマンドについては、サーバー側で処理され、クライアント側 (SL) で公開される一方向のコマンド DTO オブジェクトを使用します。これは、「CQRS、CRUD を停止し、ドメインを愛してください」に関する NDC11 セッションに触発されたものです。
  • データをクエリし、DataService を介してエンティティを公開する RIA Services スタイルが好きですが、実際には EF と NH (リレーショナル モデル) だけで機能します。
  • データのクエリに RavenDb を使用するにはどうすればよいですか? 私は共有ホスティングを使用しているため、埋め込みモードを使用する必要があり、ravendb.exe プロセスを開始できません。asp.net アプリ内でホストする必要があります。私は実際に RavenDb の経験がありません。これは学習プロジェクトのようなものです。
  • WCF で RPC SOAP エンドポイントを公開したくないのですが、REST などのより良い解決策はありますか?

したがって、コマンド側は問題ではありませんが、Silverlight アプリからデータをクエリするための RavenDb、共有ホスティング、および簡単な REST スタイルの使用方法がわかりません。RavenDb は、すぐに使えるようなものをサポートしていますか?

Ayende が答えたように、RavenDb は asp.net で実行でき、Silverlight からクエリを実行できます。質問は今、少なくとも読み取り側にとって、これは良いアプローチですか? Db は、サーバー側のロジック (サービス/アプリ層) なしでクライアント アプリに公開されるため、誰でもデータを変更できます (認証されている場合)。

コマンド (書き込み) を Silverlight から実行するか、コマンド DTO オブジェクト (DelegateToOtherMemberCommand) をサーバーに転送して、そこでドメイン オブジェクト (Ticket.AssignTo(member)) で実行しますか?

0 投票する
1 に答える
300 参照

domain-driven-design - CQRS の 2 つの異なる集計から同じデータにアクセスする

私はCQRSを読んでコンセプトが好きですが、「通常の」開発とは少し違うと思います. 実装方法の良い例が見つからないという「問題」を見つけました。そして、それが2つの異なる集約ルートから「同じデータ」にアクセスする方法です。私が理解した方法は、aggregateroot とその値を書き込みデータベースにシリアル化し、2 つの異なる aggregateroot から「同じデータ」を取得できないことです。

これが私の言いたいことの例です。

したがって、Web ショップで商品を販売する場合、その商品の ItemsInStock を減らします。そのため、Web ページで、在庫がいくつあるか、または顧客に配送する前に注文する必要があるかどうかを示すことができます。

したがって、RefillStockCommand(int number) のようなコマンドを送信できるため、製品は aggregateroot になります。私が持つもう1つのaggregaterootは、注文を顧客などに送信するSendCommand()を持つOrderです。よくわかります。

SendCommand() を実行すると、注文したすべての製品の ItemsInStock-state を減らしたいと思います。また、一部が 5 を下回った場合は、小売業者にこの製品をさらに注文したいと考えています。では、Orderaggregateroot に製品の aggregateroots をロードしても問題ありませんか? それができれば、製品のデータを取得し、SendCommand() で製品の ItemsInStock-state も変更しますが、別の aggregateroot 内の aggregateroot にアクセスしても問題ないように聞こえますが、そうでない場合はどうすれば変更できますか? 1 つのコマンドで 2 つの aggregatesroots を実行し、ビジネス検証のために別の aggregaterroot で 1 つの aggregateroots データを使用しますか?

敬具 マグナス・グラッド

0 投票する
3 に答える
1038 参照

nhibernate - NHibernateを使用したイベントソーシング

純粋なDDDパラダイムからCQRSに移行しています。私の現在の関心事は、イベントソーシング、より具体的にはイベントストアの組織化です。私はたくさんのブログ投稿を読みましたが、それでもいくつかのことを理解できません。だから私が間違っているなら私を訂正してください。

各イベントは基本的に次のもので構成されます。-イベントの日付/時刻-イベントのタイプ(これからAggregateRootのタイプも把握できます)-AggregateRoot id(Guid)-AggregateRootバージョン(更新の順序を維持するため)-イベントデータ(一部更新に必要なデータを含むシリアル化されたクラス)

これで、イベントデータが単純な値型(int、strings、enumsなど)で構成されている場合、それは簡単です。しかし、別のAggregateRootを渡す必要がある場合はどうなりますか?AR全体をイベントデータの一部としてシリアル化することはできません(すべてのデータと遅延読み込みを考えてください)。基本的には、そのARのIDを保存するだけで済みます。ただし、そのイベントを適用する必要がある場合は、最初にデータベースからそのARを取得する必要があります。そして、私のドメインモデル(リポジトリを呼び出してAR IDを操作する)からそうするのは正しくないと感じています。

このための最良のアプローチは何ですか?

ps具体的な例として、タスクエンティティとユーザーエンティティ(両方のAR)で構成されるモデルがあると仮定します。タスクは、責任のあるユーザーへの参照を保持します。ただし、責任のあるユーザーは変更できます。

更新: 混乱の原因を見つけたと思います。イベントソーシングは、読み取りモデルの構築にのみ使用する必要があると思います。この場合、IDと生データを渡すことは問題ありません。ただし、アグリゲート自体で使用されるのと同じイベント。そして、これは理解できません。

0 投票する
1 に答える
266 参照

design-patterns - CQRS でコマンドを発行する場合、どの方法を使用すればよいですか

私はおそらく NService バスを使用する予定です。イベントのディスパッチャーがイベントをサブスクライバーに発行することは理解していますが、最初のインスタンスでコマンドを発行するのが正しいかどうか疑問に思っています。

0 投票する
1 に答える
199 参照

debugging - CQRS アプリケーションのデバッグ

CQRS dev 環境をデバッグするとき - esb を実行して開発するのは面倒ですか? それともesbを偽造しますか?