問題タブ [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.
architecture - CQRS インテント コマンド イベント
内部ロジックを処理した後、データを更新するために他のシステムにイベントを発行する Web CRUD アプリケーションを作成しています。
私は CQRS を実装する最初のステップにいますが、「保存」ボタンが 1 つしかないフォームで、ユーザーの考えられるすべての意図に対して特定のコマンドを作成する必要があるのは奇妙に思えます。これは、私の要件では必要ないが、それにサブスクライブする今後のプロジェクトで必要なインテントをキャプチャするための (プロパティまたは値オブジェクトごとに) 多くのコマンドを意味します。私は、境界のあるコンテキストが必要とすることだけを行うのが好きです。
考慮すべきもう 1 つのこと: セッションを使用して、データが変更されたかどうかを比較する必要があります。保存後にデータを偽造すると、UI に誤ったデータが表示される同時実行状況が隠されます。
編集: Greg Young が、一部の画面は単なる CRUD であり、デフォルトの動作として更新を行うことに問題はないと示唆しているこのスレッドを見つけました。
cqrs - 読み取りモデルがイベントログと同期しなくなった場合の状況の処理方法は?
アグリゲートのスナップショットがイベントログと同期しなくなった場合、初期のスナップショット(同期しているはずです)からイベントを簡単に再生できます。新しいフィールドを追加/削除するとき、または既存のハンドラーのロジックを変更するときにも同じことができます。
新しい読み取りモデル(つまり、新しいレポートビュー)を追加する必要がある場合は、同じことを再度実行できます。イベントを再生します。
しかし、読み取りモデルがイベントログと同期しなくなった場合、どのように状況を処理する必要がありますか?イベントの保存と公開は1つのトランザクションで行われますが、読み取りモデルの更新は別のトランザクションで発生したため、失敗する可能性があります。最初からイベントを繰り返すことは役に立ちますが、永遠にかかる可能性があります。読み取りモデル全体のスナップショットの概念が必要ですか?
この問題をどのように解決しますか?ありがとうございました。
cqrs - イベントソーシングと辞書オブジェクト
イベントソーシングを、、などのいくつかのタイプのディクショナリオブジェクトCountry
、または定義などの特定のドメインモデルのディクショナリタイプと組み合わせる方法。一部のディクショナリオブジェクトは管理UIで編集できるはずですが、そうでないものもあります。Region
Time Zone
Budget
Availability
たとえば、国の管理UIは必要ないと判断しました。AddCountry
したがって、 /RemoveCountry
コマンドを実装する必要はありません。
イベントのセットを生成するCountryAdded
必要がありますか、つまり、辞書オブジェクトをイベントのストリームとして永続化する必要がありますか?イベントストリーム以外に信頼できる情報源を使用したことはありますか?
辞書オブジェクトのイベントストリームなしで移動できる場合、この問題をどのように解決しますか?
国のリストと各国のユーザー数を表示します。
この場合、イベントCountry
のリスナーを使用して、読み取りモデル内のオブジェクトを表現する必要があります。UserAdded
ありがとうございました。
.net - DataContext.GetTable の操作() 'QueryProvider' を取得する
DataContext.GetTable() メソッドは、次のタイプのオブジェクトを返します。
System.Data.Linq.Table
そうすることで、テーブル全体を取得するためにデータベースへの呼び出しを発行していないと思います。そうしないと、LINQ はやや非効率的になります。
したがって、厳密に型指定された Datacontext クラス (dbDataContext など) にドリルダウンして、SQL Server の Customers テーブルを表す "Customers" プロパティなどのハンドルを取得するだけです。
その後、GetTable() によって返されたオブジェクトから IQueryable を取得できますが、データベースにはヒットしていません。つまり、私の「サービス レイヤー」コードは、Linq to Sql ではなく、LINQ to Objects になります。
これをすべて行うことで、必要なリポジトリの数を減らします。
質問:
上記の仮定は正しいですか?
ノート:
インターフェイスとジェネリックを使用してクエリを作成し、テスト可能にする方法を見つけようとしています。
したがって、@zowenの応答に沿って考えてください:
リポジトリ パターン: エンティティごとに 1 つのリポジトリ クラス?
実装しようとしています
厳密には必要ではないことはわかっていますが、学習曲線をたどり、自分に合ったアーキテクチャ オプションと自分の考え方を調べています。
私がやろうとしていること:
MongoDb の代わりに SQL Server に以下を実装しようとしています。
私が望むのは、GetTable() のハンドルを取得し、それに対してサービス レイヤー Linq コードを記述することです。
IMongoDatabase データベース変数と同等のものを取得するには、ラッパー インターフェイスを作成する必要があると思います。
ただし、問題は上記の問題であり、この他の問題ではありません。私が言うように、私はここで学んでいます。このムービーでは、製品コードが損なわれることはありません。
java - Java でジェネリック インターフェイスを実装する
誰かが答えてくれることを望んでいたJavaジェネリックの質問があります。次のコードを検討してください。
この Handles インターフェイスを次のように実装したいと思います。
しかし、Java では、Generic を使用してハンドルを 2 回実装することは許可されていません。私は C# でこれを達成できましたが、リフレクションまたは instanceof とキャストを使用せずに Java で回避策を見つけることはできません。
両方のジェネリック インターフェイスを使用して Handles インターフェイスを実装する Java の方法はありますか? それとも、最終結果を達成できるように Handles インターフェイスを記述する別の方法でしょうか?
java - Java の世界での CQRS
私は長い間 cqrs についての議論をフォローしています。
私が思いついたのは、選択したプログラミング言語はほとんど dot.Net の世界に定着しているということです。
これが事実である理由はありますか?cqrs の概念がまだ Java の世界に組み込まれていないのはなぜですか? 私がまだ知らないJava成層圏で別の名前が付けられている可能性がありますか?
azure - CQRSでのセットベースの制約の実装
私はまだCQRSスタイルのアーキテクチャに関連する基本的な(そして解決された)問題に苦労しています:
集約ルートのセットに依存するビジネスルールをどのように実装しますか?
例として、予約アプリケーションを取り上げます。コンサートのチケット、映画の座席、レストランのテーブルを予約できる場合があります。いずれの場合も、販売される「アイテム」の数は限られています。
イベントや場所がとても人気があると想像してみましょう。新しいイベントや時間帯の販売が開始されると、予約は非常に迅速に到着し始めます。おそらく1秒あたりの数が多くなります。
クエリ側では、大規模な拡張が可能であり、予約はキューに入れられ、自律コンポーネントによって非同期的に処理されます。最初は、予約コマンドをキューから削除するときに受け入れますが、ある時点で、残りのコマンドを拒否し始める必要があります。
限界に達したとき、どうやって知ることができますか?
予約コマンドごとに、ある種の店舗に問い合わせて、リクエストに対応できるかどうかを判断する必要があります。これは、その時点ですでに受け取った予約の数を知る必要があることを意味します。
ただし、ドメインストアがWindows Azureテーブルストレージなどの非リレーショナルデータストアである場合、SELECT COUNT(*) FROM ...
1つのオプションは、次のように、現在のカウントを追跡するだけの個別の集約ルートを保持することです。
- AR:予約(誰?何人?)
- AR:イベント/タイムスロット/日付(集計数)
2番目の集約ルートは最初の集約ルートの非正規化された集約ですが、基盤となるデータストアがトランザクションをサポートしていない場合、大量のシナリオでこれらが同期しなくなる可能性が非常に高くなります(これが私たちが試みていることです)そもそもアドレス)。
考えられる解決策の1つは、予約コマンドの処理をシリアル化して、一度に1つだけが処理されるようにすることですが、これはスケーラビリティ(および冗長性)の目標に反します。
このようなシナリオは、標準の「在庫切れ」シナリオを思い出させますが、違いは、予約をバックオーダーにうまく入れることができないことです。イベントが完売すると完売するため、補償措置がどうなるかわかりません。
そのようなシナリオをどのように処理しますか?
language-agnostic - CQRSを適用するときに作成でIDを取得するには?
CQRS に対する私の見解は、厳密に従えばコマンドが何も返さない (戻り値の型が void) ということです。したがって、私の例は非常に簡単です。
たとえば、クレジット カード トランザクションを作成する場合、トランザクション ID を返すことがかなり重要であると思われます。また、顧客を作成する場合、作成した顧客または顧客 ID を取得してブラウザがその顧客に自動的に移動できるようにすると、はるかに簡単になります。たとえばページ。
解決策の 1 つは、最初に ID を要求してから、その ID を使用して顧客またはトランザクションを作成することですが、かなり奇妙に思えます。
誰かがこれを経験したことがありますか、または最も効果的な方法でそれを行う方法を知っていますか? 多分私は何かを誤解しましたか?
cqrs - CQRS - イベントやその他の情報源を使用して読み取りモデルを構築するための許可された依存関係
私の質問は、CQRS (Command and Query Responsibility Segregation) と、読み取りモデル (ビュー) を構築するメカニズムに関するものです。私が理解している限り、読み取りモデルはイベント ハンドラーによって構築されます。これらのハンドラー (デノーマライザーとも呼ばれます) はドメイン イベントを受け取り、これらのイベントを使用してデータのさまざまなビューを構築します。
特定のイベントは、ドメイン モデルで行われた変更に関する情報を伝達します。この情報は、場合によってはビューを構築するのに十分ではないと思います-つまり、フィールドが変更されていない、変更されていないエンティティがそのようなイベントで欠落しているなどです。
だから私の質問は:
読み取りモデルの構築を担当するデノーマライザーがイベントだけでなく、以下にもアクセスすることは許可されていますか?
- イベントで直接参照されるエンティティが変更されましたか?
- 集約されたルートと、この集約に関連するエンティティを変更しましたか?
- リポジトリからフェッチされたエンティティはありますか?
- 任意のビュー?
イベント ハンドラー (デノーマライザー) に許可されている依存関係についてどう思いますか?
編集:上記の質問に簡単な例を追加しました:
次のモデルがあるとします。
AR: ProductOffering * 名前 * 説明 * カテゴリ * 価格
AR: 顧客 * 名前 * タイプ * メソッド: ProductPurchasedByCustomer イベントを発行する purchaseProduct(productOffering)
エンティティ: ProductInstance * 顧客 * productOffering
イベント: ProductPurchasedByCustomer * customerId * productOfferingId
ビュー: ProductInventoryView * customerId * productOfferingId * customerType * productOfferingName * productOfferingCategory * 価格
ProductPurchasedByCustomer イベントのみを使用して ProductInventoryView を構築する方法は? customerType、productOfferingName などに関する情報をビューに表示するデノーマライザーを作成するにはどうすればよいですか? 別のビューから customerType と productOfferingName に関する追加情報を検索する必要がありますか?
cqrs - CQRS & ElasticSearch - ElasticSearch を使用して読み取りモデルを構築する
CQRSアプローチで読み取りモデルを構築するためにElasticSearchを使用している人はいますか? そのようなソリューションに関連するいくつかの質問があります:
- ドメイン イベントをどこに保存しますか? JDBCデータベースで?エラスティックサーチで?
- ドメイン イベントを処理するイベント ハンドラまたは ElasticSearch River 機能を使用してインデックスを構築しますか?
- ビュー モデルの完全な再構築をどのように処理しますか? たとえば、ビューが破損している場合などです。ビューを再構築するためにすべてのイベントを処理しますか?