タグ付けされた質問 「cqrs」

コマンドクエリの責任分担の設計パターン

6
明確な意味を持つ2つの方法、または1つのデュアルユース方法を使用する方が良いでしょうか?
インターフェイスを簡素化するには、getBalance()メソッドを持たない方が良いでしょうか?に渡す0とcharge(float c);同じ結果が得られます。 public class Client { private float bal; float getBalance() { return bal; } float charge(float c) { bal -= c; return bal; } } たぶんメモしてくださいjavadoc?または、バランスを取る方法を理解するためにクラスユーザーに任せてください。
30 interfaces  cqrs 

5
REST APIはコマンド/アクションベースのドメインにどのように適合しますか?
この記事の著者は、 時には、本質的にRESTfulではない操作をAPIで公開する必要があります。 そしてそれ APIのアクションが多すぎる場合は、RESTful原則を使用するのではなくRPCの観点で設計されているか、問題のAPIがRPCタイプモデルにより適していることを示しています。 これは、他の場所でも読んだり聞いたりしたことを反映しています。 しかし、これは非常に紛らわしいと思うので、問題をよりよく理解したいと思います。 例I:RESTインターフェースを介してVMをシャットダウンする VMのシャットダウンをモデル化するには、根本的に異なる2つの方法があると思います。それぞれの方法にはいくつかのバリエーションがありますが、ここでは最も基本的な違いに集中しましょう。 1.リソースの状態プロパティにパッチを適用します PATCH /api/virtualmachines/42 Content-Type:application/json { "state": "shutting down" } (または、PUTサブリソース上/api/virtualmachines/42/state。) VMはバックグラウンドでシャットダウンし、シャットダウンが成功するかどうかに応じて、後のある時点で状態が「電源オフ」で内部的に更新される可能性があります。 2.リソースのアクションプロパティのPUTまたはPOST PUT /api/virtualmachines/42/actions Content-Type:application/json { "type": "shutdown" } 結果は、最初の例とまったく同じです。状態はすぐに「シャットダウン」に更新され、最終的には「電源オフ」に更新されます。 どちらのデザインもRESTfulですか? どちらのデザインが優れていますか? 例II:CQRS 複数の集約の更新につながる可能性のある、または具体的なリソースとサブリソースのCRUD操作にマッピングできない「アクション」(別名コマンド)が多数あるCQRSドメインがある場合はどうなりますか? 具体例で可能な限り多くのコマンドを具体的なリソースで作成または更新し(例Iの最初のアプローチに従って)、残りの部分に「アクションエンドポイント」を使用してみてください。 または、すべてのコマンドをアクションエンドポイントにマッピングする必要があります(例Iの2番目のアプローチのように)。 どこで線を引きますか?設計のRESTful性が低下するのはいつですか? CQRSモデルは、APIのようなRPCにより適していますか? 上記の引用テキストによると、私が理解しているとおりです。 私の多くの質問からわかるように、このトピックについて少し混乱しています。それをよりよく理解するのを手伝ってもらえますか?

2
CQRSコマンドをどの程度正確に検証し、ドメインオブジェクトに変換する必要がありますか?
あるデータストアにきめ細かなデータを持ち、分析の大きな可能性を提供し、ビジネス価値を向上させ、必要に応じてパフォーマンスを向上させるために非正規化データを含む読み取りを必要とする柔軟性を備えているため、貧乏人のCQRS 1をかなり長い間適応させてきました。 しかし、残念ながら最初から、このタイプのアーキテクチャにビジネスロジックを正確に配置する必要があるという問題に苦労してきました。 私が理解していることから、コマンドは意図を伝える手段であり、ドメイン自体とは関係がありません。これらは基本的にデータ(ダム-必要に応じて)転送オブジェクトです。これは、異なるテクノロジー間でコマンドを簡単に転送できるようにするためです。同じことが、正常に完了したイベントへの応答としてイベントに適用されます。 典型的なDDDアプリケーションでは、ビジネスロジックはエンティティ、値オブジェクト、集約ルート内に存在し、データだけでなく動作も豊富です。ただし、コマンドはドメインオブジェクトではないため、データのドメイン表現に限定されるべきではありません。これは、コマンドに過度の負担をかけるためです。 本当の質問は、ロジックはどこにあるのでしょうか? 値の組み合わせについていくつかのルールを設定する非常に複雑な集合体を構築しようとすると、私はこの闘争に最も頻繁に直面することがわかりました。また、ドメインオブジェクトをモデル化するときは、フェイルファーストパラダイムに従い、オブジェクトがいつメソッドに到達するかを知ることが有効な状態にあることを好みます。 集約Carが2つのコンポーネントを使用するとします。 Transmission、 Engine。 両方TransmissionとEngine値オブジェクトは、スーパータイプとして表され、サブタイプ、記載しているAutomaticとManualトランスミッション、またはPetrolとElectricそれぞれエンジン。 このドメインでは、それ自体で生活TransmissionするAutomaticかManual、成功するか、それとも、またはいずれかのタイプEngineが完全に作成されます。しかし、Car集約は該当する場合にのみ、いくつかの新しいルールを紹介Transmissionし、Engineオブジェクトが同じコンテキストで使用されています。すなわち: 車がElectricエンジンを使用する場合、許可されるトランスミッションタイプはのみですAutomatic。 車がPetrolエンジンを使用するとき、それはどちらのタイプも持つかもしれませんTransmission。 コマンドを作成するレベルでこのコンポーネントの組み合わせの違反をキャッチできましたが、前に述べたように、コマンドにはドメインレイヤーに限定されるべきビジネスロジックが含まれるため、実行すべきではないことを理解しているからです。 オプションの1つは、このビジネスロジック検証をコマンドバリデータ自体に移動することですが、これも正しくないようです。コマンドを分解し、ゲッターを使用して取得したプロパティを確認し、バリデーター内でそれらを比較して結果を検査しているように感じます。それは私にとってデメテルの法則違反のような叫びです。 上記の検証オプションは実行可能とは思えないため、破棄することは、コマンドを使用してそれから集計を構築する必要があるようです。しかし、このロジックはどこにあるべきでしょうか?具体的なコマンドを処理するコマンドハンドラー内にあるべきですか?それとも、おそらくコマンドバリデーター内にあるべきでしょう(このアプローチも好きではありません)。 現在、コマンドを使用しており、責任あるコマンドハンドラー内でコマンドから集計を作成しています。しかし、これを行うと、CreateCarコマンドが存在する場合、コマンドバリデータがまったく含まれないため、コマンドバリデータがあれば、別のケースで有効であることがわかっているコンポーネントが含まれますが、集計は異なると言う場合があります。 CreateUserコマンドを使用して新しいユーザーを作成する、さまざまな検証プロセスを組み合わせたさまざまなシナリオを想像してみましょう。 コマンドには、Id作成されたユーザーとそのが含まれますEmail。 システムは、ユーザーの電子メールアドレスについて次のルールを示します。 一意である必要があり、 空にしないでください、 最大100文字(db列の最大長)でなければなりません。 この場合、一意の電子メールを持つことはビジネスルールですが、システム内の現在の電子メールのセット全体をメモリにロードし、コマンドで電子メールをチェックする必要があるため、集約でチェックすることはほとんど意味がありません集合体に対して(Eeeek!何か、何か、パフォーマンス。)。そのため、このチェックをコマンドバリデータに移動します。コマンドバリデータはUserRepository、依存関係として受け取り、リポジトリを使用して、コマンドに電子メールが存在するユーザーが既に存在するかどうかをチェックします。 これに関しては、他の2つの電子メールルールをコマンドバリデーターに入れることは突然意味があります。しかし、ルールはUser集約内に実際に存在し、コマンドバリデーターは一意性のみをチェックし、検証が成功した場合は、User集約を作成CreateUserCommandHandlerしてリポジトリに渡し、保存する必要があると感じています。 リポジトリのsaveメソッドは、集約が渡されるとすべての不変条件が満たされることを保証する集約を受け入れる可能性が高いため、このように感じます。ロジック(空でないなど)がコマンド検証自体にのみ存在する場合、別のプログラマーはこの検証を完全にスキップUserRepositoryして、Userオブジェクトでsaveメソッドを直接呼び出すことができ、致命的なデータベースエラーにつながる可能性があります長すぎました。 これらの複雑な検証と変換をどのように個人的に処理しますか?私はほとんど自分のソリューションに満足していますが、選択肢にかなり満足するためには、私のアイデアとアプローチが完全に愚かではないことを断言する必要があると感じています。私は完全に異なるアプローチに完全にオープンです。個人的に何か試してみて、あなたのために非常にうまくいったことがあるなら、私はあなたの解決策を見たいと思います。 1 RESTfulシステムの作成を担当するPHP開発者として働いている私のCQRSの解釈は、コマンドを同期的に処理する必要があるためにコマンドから結果を返すことがあるなど、標準の非同期コマンド処理アプローチとは少し異なります。

2
ES / CQRS同時処理
私は最近、職場で適用する必要があるかもしれないので、CQRS / ESに飛び込み始めました。多くの問題を解決するため、私たちのケースでは非常に有望です。 ES / CQRSアプリが、単純化された銀行のユースケース(出金)にコンテキスト化されたように見える方法についての大まかな理解をスケッチしました。 要約すると、Aがお金を引き出した場合: コマンドが発行されます 検証/検証のためにコマンドが引き渡される 検証が成功した場合、イベントはイベントストアにプッシュされます アグリゲーターはイベントをデキューして、集約に変更を適用します 私が理解したことから、イベントログは真実の源であり、FACTSのログであるため、それから予測を導き出すことができます。 さて、この壮大な計画の中で私が理解できないのは、この場合に何が起こるかです: ルール:残高をマイナスにすることはできません 人Aのバランスは100eです 人Aは100eのWithdrawCommandを発行します 検証に合格し、100eイベントのMoneyWithdrewEventが発行されます その間に、人Aは100eの別のWithdrawCommandを発行します 最初のMoneyWithdrewEventはまだ集約されていなかったため、検証は合格です。これは、集約に対する検証チェック(まだ更新されていないため) 100eのMoneyWithdrewEventがもう一度発行されます ==>残高が-100eで、ログに2つのMoneyWithdrewEventが含まれる一貫性のない状態です 私が理解しているように、この問題に対処するにはいくつかの戦略があります。 a)集約バージョンIDをイベントストアにイベントとともに配置し、変更時にバージョンの不一致がある場合、何も起こらない b)検証層が何らかの方法で作成する必要があることを意味する、いくつかのロック戦略を使用する 戦略に関する質問: a)この場合、イベントログはもはや真実の源ではありません。どう対処するのですか?また、引き出しを許可することは完全に間違っていましたが、クライアントに戻りましたが、この場合はロックを使用する方が良いですか? b)ロック==デッドロック、ベストプラクティスに関する洞察はありますか? 全体として、並行性の処理方法に関する私の理解は正しいですか? 注:同じ人がこのような短い時間枠で2倍のお金を引き出すことは不可能であることを理解していますが、詳細に迷子にならないように簡単な例を取り上げました

3
コマンドでの検証後エラーの処理方法(DDD + CQRS)
たとえば、登録フォームを送信するときは、有効な状態(例、電子メールアドレスの構文、年齢など)であることをDomain Model(WriteModelin CQRS)にチェックインする必要があります。 次に、を作成しCommand、それをに送信しますCommand Bus。 コマンドは何も返すべきではないことを理解しています。 では、エラーをどのように処理しますCommand Busか?(たとえば、1秒前に同じで登録したユーザーusername/email)。 そのコマンドが失敗したことをどのようにして知り、どのようにしてエラーを知っていますか?

5
サービスがSOAでデータベースを共有することは悪い習慣ですか?
最近、私はHohpeとWoolfのEnterprise Integration Patterns、Thomas ErlのSOAに関する本を読んでおり、Udi Dahanらによるさまざまなビデオやポッドキャストを見てきました。CQRSおよびイベント駆動型システム。 私の職場のシステムは、高い結合に悩まされています。各システムには理論的に独自のデータベースがありますが、それらの間には多くの結合があります。実際には、これは、すべてのシステムが使用する1つの巨大なデータベースがあることを意味します。たとえば、顧客データのテーブルが1つあります。 私が読んだことの多くは、各システムがデータベースのみを使用し、メッセージングを使用して他のすべてのシステムに更新が伝播されるように、データの非正規化を示唆しているようです。 これはSOAの境界を強化する方法の1つだと思いました-各サービスには独自のデータベースが必要ですが、それを読んでみました: /programming/4019902/soa-joining-data-across-multiple-services そして、これは行うのが間違っていることを示唆しています。 データベースを分離することは、システムを分離する良い方法のように見えますが、今は少し混乱しています。これは良いルートですか?SOAサービス、DDDバウンドコンテキスト、アプリケーションなどでデータベースを分離することをお勧めしますか?

3
DDDとCRQSを使用する場合、コマンドごとにイベントを1つだけにする必要がありますか?
構成より規約を使用してdddアプリケーションを設計する方法を探しています。 集約「クライアント」に「FillProfile」と定義されたコマンドがあるとします。論理的に「ProfileFilled」イベントを発生させます。 コマンドがイベントよりも多く発生する場合、またはコマンドが何らかのロジックに基づいて異なるイベントを発生する場合がありますか?または、これは常に1対1の関係です(1つのコマンドは常に何も発生させないか、特定のタイプの単一のイベントを発生させます)。 これが事実である場合、コマンドが常に同じイベントを発生させるため、その事実に基づいてコンベンションシステムを構築できるため、これを求めています。「RaiseEvent」が「EventRaised」になることを知っています...

2
DDD CQRS-クエリごとおよびコマンドごとの承認
概要 CQRS / DDDの承認は、コマンド/クエリごとに実装する必要がありますか? 多かれ少なかれ厳密にDDD CQRSパターンを使用するオンラインアプリケーションを初めて開発しています。私はいくつかの問題にぶつかりましたが、それを本当に回避することはできません。 私が作成しているアプリケーションは、元帳アプリケーションで、元帳を作成できるほか、従業員など他の人が元帳を表示/編集/削除できます。元帳の作成者は、作成した元帳のアクセス権を編集できる必要があります。所有権を変更することさえできます。ドメインには、TLedgerとTUserの 2つの集約があります。 セキュリティ、認可などに関するDDD / CQRSキーワードを含む多くの投稿を読みました。それらのほとんどは、セキュリティアプリケーションを構築していない限り、認可はGeneric Subdomainであると述べました。 この場合、コアドメインは確かに、トランザクション、バランシング、アカウントに関心のあるアカウンティングドメインです。ただし、元帳へのきめ細かいアクセスを管理できる機能も必要です。これをDDD / CQRSの用語でどのように設計するのか疑問に思っています。 コマンドがユビキタス言語の一部であるということは、DDDチュートリアルの至る所で述べられています。それらは意味があります。それらは「本物」を表す具体的なアクションです。 これらのコマンドとクエリはすべて、ユーザーが「実際に」実行する実際のアクションであるため、承認の実装をこれらすべての「コマンド」および「クエリ」と組み合わせる必要がありますか?ユーザーには、たとえばTLedger.addTransaction()を実行する権限がありますが、TLedger.removeTransaction()は実行できません。または、ユーザーはクエリ「getSummaries()」を実行できますが、「getTransactions()」は実行できません。 アクセス権を決定するために、user-ledger-commandまたはuser-ledger-queryの形式で3次元マッピングが存在します。 または、切り離された方法で、「permissions」という名前がユーザーに登録されます。特定のコマンド用にマップされる許可。たとえば、権限「ManageTransactions」では、ユーザーは「AddTransaction()」、「RemoveTransaction()」などを実行できます。 権限マッピングユーザー->元帳->コマンド/クエリ パーミッションマッピングユーザー->元帳->パーミッション->コマンド/クエリ それが質問の最初の部分です。または、簡単に言えば、CQRS / DDDの承認はコマンドごとまたはクエリごとに実装する必要がありますか?または、許可をコマンドから分離する必要がありますか? 第二に、許可に基づいた認可について。ユーザーは、自分の元帳または管理が許可されている元帳の権限を管理できる必要があります。 元帳で許可管理コマンドが発生する grantPermission()、revokePermission()などのイベント/コマンド/ハンドラーをLedger集計に追加することを考えました。この場合、これらのルールの強制はコマンドハンドラーで発生します。ただし、これにはすべてのコマンドに、そのコマンドを発行したユーザーのIDを含める必要があります。次に、そのコマンドを実行する権限がそのユーザーに存在する場合、TLedgerをチェックインします。 例えば ​​: class TLedger{ function addTransactionCmdHandler(cmd){ if (!this.permissions.exist(user, 'addTransaction') throw new Error('Not Authorized'); } } ユーザーの許可管理コマンド もう1つの方法は、TUserにアクセス許可を含めることです。TUserには一連の権限があります。次に、TLedgerコマンドハンドラーでユーザーを取得し、コマンドを実行する権限があるかどうかを確認します。しかし、これには、すべてのTLedgerコマンドのTUser集計を取得する必要があります。 class TAddTransactionCmdHandler(cmd) { this.userRepository.find(cmd.userId) .then(function(user){ if …

2
CQRSは過剰設計ではありませんか?
古き良き時代のリポジトリを今でも覚えています。しかし、リポジトリは時間とともにいものになりました。その後、CQRSが主流になりました。彼らは素晴らしく、新鮮な空気の息吹でした。しかし、最近、コントローラーのアクションメソッド(特にアクション自体が何らかのコマンド/クエリハンドラーであるWeb Api)でロジックを正しく維持しないように何度も自問しています。 以前は、そのための明確な答えがありました。すべてのそれらのモックできないシングルトンと全体的ないASP.NETインフラストラクチャでControllerをテストするのは難しいので、テストのためにそれをしました。しかし、時代は変わっており、ASP.NETインフラストラクチャクラスは、今日では(特にASP.NET Coreで)はるかに単体テストに適しています。 典型的なWebApi呼び出しは次のとおりです。コマンドが追加され、SignalRクライアントに通知されます。 public void AddClient(string clientName) { using (var dataContext = new DataContext()) { var client = new Client() { Name = clientName }; dataContext.Clients.Add(client); dataContext.SaveChanges(); GlobalHost.ConnectionManager.GetHubContext<ClientsHub>().ClientWasAdded(client); } } 簡単に単体テスト/モックできます。さらに、OWINのおかげで、ローカルWebApiおよびSignalRサーバーをセットアップし、統合テストを実行できます(ちなみにかなり高速です)。 最近、面倒なコマンド/クエリハンドラを作成するモチベーションが低下し、Web Apiアクションにコードを保持する傾向がありました。ロジックが繰り返されるか、それが本当に複雑で、それを分離したい場合にのみ、例外を作成します。しかし、ここで正しいことをしているかどうかはわかりません。 典型的な最新のASP.NETアプリケーションでロジックを管理するための最も合理的なアプローチは何ですか?コードをコマンドおよびクエリハンドラーに移動するのが妥当なのはいつですか?より良いパターンはありますか? 更新。DDD-liteアプローチに関するこの記事を見つけました。したがって、コードの複雑な部分をコマンド/クエリハンドラに移動するという私のアプローチは、CQRS-liteと呼ばれるようです。

5
DDD、Saga、およびイベントソーシング:補償アクションは、イベントストアで単に削除できますか?
上記の質問はおそらくいくつかの「何??」を発生させることを理解していますが、説明しよう: 私は、いくつかの関連する概念、基本的にはSaga-pattern(http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf)とEvent-sourcing(A DDD-concept)に頭を包み込もうとしています。:http : //en.wikipedia.org/wiki/Domain-driven_design) まとめた良い投稿:https : //blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/ 私はすぐに質問に近づいていますが、最初にそれについて理解していることを要約しようとする必要があると思います(これは間違っている可能性がありますので、その場合は修正してください)次から始まる質問をする: Sagaパターンは、アクション(エンドユーザー、自動化など、本質的にデータを変更するもの)を指定したブローカーの一種で、そのアクションをビジネスアクティビティに分割し、これらの各アクティビティをメッセージとしてメッセージバスに送信します。次に、それをそれぞれの集約ルートに送信して処理します。 これらの集約ルートは完全に自律的に動作できます(懸念事項の分離、優れたスケーラビリティなど)。 Sagaインスタンス自体には、ビジネスロジックが含まれていません。ビジネスロジックは、アクティビティを送信する集約ルートに含まれています。佐賀に含まれる唯一の「ロジック」は「プロセス」ロジック(多くの場合Statemachineとして実装されます)で、受信したアクション(およびフォローアップイベント)に基づいて何を行うか(つまり、どのアクティビティを送信するか)を決定します Saga-patternsは、一種の分散トランザクションパターンを実装します。つまり、集約ルートの1つ(相互の存在を認識せずに自律的に動作する)の1つが失敗した場合、アクション全体をロールバックする必要があります。 これは、佐賀へのアクティビティレポートの完了時に、すべての集約ルートを持つことで実装されます。(成功とエラーの場合) すべての集約ルートが成功を返す場合、佐賀が次に何をすべきかを決定する(または完了したと判断する)場合、内部ステートマシン 失敗した場合、佐賀は、最後のアクションに参加したすべての集約ルートに対して、いわゆる補償アクション、つまり、各集約ルートが行った最後のアクションを取り消すアクションを発行します。 アクションが「プラス1票」の場合、これは単に「マイナス1票」を実行することですが、ブログポストを以前のバージョンに復元するなど、より複雑になる可能性があります。 イベントソーシング(2つを組み合わせたブログ投稿を参照)は、集約された各ルートが行う各アクティビティの結果を一元化されたイベントストアに保存することを外部化することを目的としています(このコンテキストでは変更は「イベント」と呼ばれます) このイベントストアは「真実の単一バージョン」であり、保存されたイベントを繰り返すだけで(本質的にイベントログのように)すべてのエンティティの状態を再生するために使用できます。 2つを組み合わせること(つまり、集約ルートがイベントソーシングを使用して変更を保存し、佐賀に報告する前に変更を保存する)により、多くの素晴らしい可能性が可能になります。 これを一度に把握するのは大変なので、肩から離す必要があると感じました。このコンテキスト/マインドセットが与えられます(もう一度、間違っている場合は修正してください) 質問:集約ルートが補正アクションを受信し、その集約ルートがイベントソーシングを使用した状態変更を外部委託している場合、すべての状況での補正アクションは、そのイベントストアの最後のイベントの削除だけではありません集約ルートを指定しますか?(persist-implementationが削除を許可すると仮定) それは私にとって非常に理にかなっています(そしてこの組み合わせのもう一つの大きな利点です)が、私が言ったように、これらの概念の誤った/不完全な理解に基づいてこれらの仮定をしているかもしれません。 これが長すぎないことを願っています。 ありがとう。

2
イベントソーシングでプロセスマネージャーを実装する方法
私はCQRSとイベントソーシングの概念を学ぶために、小さなサンプルアプリケーションに取り組んでいます。私が持っているBasket骨材とProduct独立して動作するはず集計を。 実装を示すための擬似コードを次に示します Basket { BasketId; OrderLines; Address; } // basket events BasketCreated { BasketId; } ItemAdded { BasketId; ProductId; Quantity } AddItemSucceeded { BasketId; ProductId; Quantity } AddItemRevoked { BasketId; ProductId; Quantity } ItemRemoved { BasketId; ProductId; Quantity } CheckedOut { BasketId; Address } Product { ProductId; Name; Price; } …

2
SQL ServerとMongoを一緒に使用できますか?
Webトラフィックが多い、ニュース向けの大きなサイトがあります。アーキテクチャは、よく見られるDB-レポ層-サービス層-Asp.Net MVCです。私たちが見てきた問題は、読み取りパフォーマンスにあります。このDDDドメインオブジェクトはすべて、理論的にはビジネスルールにとっては優れていますが、読み取りパフォーマンスの最適化に関しては困難になっています。 解決策として、まったく新しいもの(私たちにとって)を検討しています。noSQLの使用です。私たちのウェブサイトに表示されるデータにnoSQLデータベースを使用したいと思います。SQL Serverを削除することはできません(少なくともいつでも)が、実際の手順は、Mongoをすべての新しい開発のクエリデータベースとして使用することだと思われます。 私の質問は、SQL Serverをレコードのデータベースとして使用し、Mongoをクエリデータベースとして一緒に使用できるかどうかです。 そのため、エディターの1人がレコードを更新すると、データはSQL Serverに保存されます。これは、一晩で書き直すことができないレガシーコードが多すぎるために必要です。 しかし、Webサイトの閲覧者が記事または記事のリストを表示するとき、Mongo対SQL Serverのパフォーマンスを活用したいと思います。データを多少最新の状態に保つため、たとえば15分以内にSQL Serverデータを更新するには、Mongoを更新する必要があります。RDBMSには、このような操作のためのレプリケーションツールがあり、SQL ServerからMongoに同じことを行う何かがあるかどうか疑問に思っています。Lyncサーバー、おそらく?
14 sql-server  nosql  cqrs  mongo 

2
イベントソーシングの副作用に対処するにはどうすればよいですか?
奇妙なパターンが検出された場合に電子メールでユーザーに警告する金融アプリケーション用の小さなセキュリティサブシステムを実装すると仮定します。この例では、パターンは図のように3つのトランザクションで構成されます。セキュリティサブシステムは、メインシステムからキューからイベントを読み取ることができます。 私が取得したいのは、パターンの現在の状態をモデル化する中間表現なしで、システムで発生するイベントの直接的な結果であるアラートです。 監視が有効になりました 処理されたトランザクション 処理されたトランザクション 処理されたトランザクション アラートがトリガーされました(id:123) 送信されたアラートの電子メール(ID:123) 処理されたトランザクション これを念頭に置いて、明確な答えのない質問がありますが、イベントソーシングはここで非常にうまく適用できると思いました。この例でトリガーされたアラートには、明らかな副作用があり、電子メールを送信する必要があります。これは、一度しか発生しない状況です。したがって、集合体のすべてのイベントを再生するときに発生することはありません。 ある程度、CQRS /イベントソーシングの文献で何度も見たクエリ側で生成された実体化と同様に送信する必要がある電子メールが表示されますが、それほど微妙な違いはありません。 この文献では、クエリ側は、すべてのイベントを再度読み取る特定の時点で状態の具体化を生成できるイベントハンドラから構築されています。ただし、この場合、前に説明した理由により、そのように正確に実行することはできません。すべての状態が一時的であるという考えはここでそれほど適切ではありません。アラートがどこかに送信されたという事実を記録する必要があります。 私にとって簡単な解決策は、以前にトリガーされたアラートの記録を保持する別のテーブルまたは構造を持つことです。IDがあるため、同じIDのアラートが以前に発行されたかどうかを確認できます。この情報があると、SendAlertCommandはべき等になります。複数のコマンドを発行できますが、副作用は一度しか発生しません。 その解決策を念頭に置いても、これがこの問題のこのアーキテクチャに何か問題があるというヒントかどうかはわかりません。 私のアプローチは正しいですか? これに関する詳細情報を見つけることができる場所はありますか? これについての詳細情報を見つけることができなかったことは奇妙です。たぶん私は間違った表現を使っていたのかもしれません。 どうもありがとうございます!

1
コマンドまたはイベントを使用する必要がありますか?
バス通信におけるコマンドとイベントの違いは、私には少し曖昧に思えます。コマンドは1回だけ実行する必要があることを知っていますが、イベントは複数回処理できますが、コマンドまたはイベントをいつ使用するかはわかりません。 例を見てみましょう: 新しいユーザーがWebアプリケーションに登録するときに、彼にアカウントを作成し、確認メールを送信する必要があります。 アカウントを作成する -これはCreateUserCommand、バスにを送信して、専用のコンポーネントに処理させるための適切な場所のようです。 または、これは非同期バス通信で実装するべきではありませんか?ユーザーがすぐにアプリケーションにログインできるようにしたいと考えています。バスでは、コマンドがいつ実行されるかは保証されません。 メールの送信 -コンポーネントがアカウントを作成した後、2つの可能性を確認できます バスに別のコマンドを送信します SendConfirmationEmailCommand イベントを公開する UserAccountCreatedEvent そして、電子メール送信コンポーネントがそれを取得し、それを仕事にします。 一方では、確認メールを1回だけ送信したい(コマンドを使用する)一方で、新しく登録したユーザーに関係するコンポーネントが複数存在する可能性があると考えています。ロガーまたはSMS送信者。 どのように実装しますか?

3
イベントストアではなく「スナップショット」プロジェクションから集計を再水和する
そのため、実際のプロジェクトにパターンを適用する機会は一度もありませんでしたが、しばらくの間、イベントソーシングとCQRSをいじっていました。 読み取りと書き込みの懸念を分離することの利点を理解しています。また、イベントソースとは異なり、イベントストアとは異なる「読み取りモデル」データベースに状態の変更を簡単に投影できます。 私があまりはっきりしていないのは、イベントストア自体から集計を再水和する理由です。 「読み取り」データベースへの変更の投影が非常に簡単な場合、スキーマがドメインモデルと完全に一致する「書き込み」データベースへの変更を常に投影しないのはなぜですか。これは、事実上スナップショットデータベースになります。 これは、ES + CQRSアプリケーションでかなり一般的だと思います。 この場合、イベントストアは、スキーマの変更の結果として「書き込み」データベースを再構築するときにのみ役立ちますか?それとも、もっと大きなものが欠けていますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.