web-dev-qa-db-ja.com

cqrsとcqsの違い

私は[〜#〜] cqrs [〜#〜]パターンとは何かを学んでおり、[〜#〜] cqs [〜#〜]パターン

検索しようとすると、diagramsinfoon[〜#〜] cqrs [〜#〜]しかし、[〜#〜] cqsについてはあまり見つかりませんでした[〜#〜]

キーポイント[〜#〜] cqrs [〜#〜]パターン

Cqrsには、書き込むモデルが1つ(コマンドモデル)読み込むモデルが1つ(クエリモデル)、これは完全に分離されています

enter image description here

[〜#〜] cqs [〜#〜][〜#〜] cqrs [ 〜#〜]。 。 ?

キーポイントとは何ですか? 。 ?

どんな援助も大歓迎です:)

44
Mr punch

CQS(Command Query Separation)とCQRS(Command Query Responsibility Segregation)は非常に関連しています。 CQSはクラスまたはコンポーネントレベルにあると考えることができますが、CQRSはより限定されたコンテキストレベルにあります。

私は、CQSをミクロレベルで、CQRSをマクロレベルであると考える傾向があります。

CQSは、モデルからのクエリまたはモデルへの書き込みのための個別のメソッドを規定しています。クエリは状態を変化させませんが、コマンドは状態を変化させますが、戻り値は持ちません。これは、Bertrand MeyerがEiffelプログラミング言語に関する先駆的な研究の一環として考案したものです。

CQRSは同様のアプローチを規定していますが、それはあなたのシステムを通るより多くの道です。クエリ要求は、コマンドとは別のパスを取ります。クエリは、基になるシステムを変更せずにデータを返します。このコマンドはシステムを変更しますが、データを返しません。

グレッグヤングは、CQRSが何年か前に作成したものの かなり徹底的な評価 をまとめ、CQRSがCQSの進化である方法について説明します。このドキュメントは数年前にCQRSを紹介してくれましたが、今でも非常に便利なリファレンスドキュメントです。

55
David Hoerster

これは古い質問ですが、答えに挑戦します。 StackOverflowで質問に答えることはあまりないので、物事へのリンク、長い回答の作成など、コミュニティの枠を超えて何かを行う場合はご容赦ください。

CQRSとCQSには多くの違いがありますが、CQRSusesCQSはその定義内です! 2つの定義から始めましょう。それから、相違点について説明します。

CQSは、戻り値に応じて2種類のメッセージを定義します。戻り値なし(void)は、これがコマンドであることを指定します。戻り値(非void)は、このメソッドがクエリであることを指定します。

  • コマンド変更情報
  • クエリは情報を返します

コマンドは状態を変更します。クエリはしません。

ここで、コマンドおよびクエリのCQSと同じ定義を使用するCQRSについて説明します。 CQRSは、CommandメソッドとQueryメソッドではone objectが必要ないことを示しています。代わりに、2つのオブジェクト:すべてのコマンドを含むものと、すべてのクエリを含むものが必要です。

全体的な考え方は非常にシンプルです。面白くなるのは、これを行うすべてafterです。オンラインで多数の講演があり、関連する属性のいくつかについて議論しています(ここで入力するのは残念です!)。

6
Greg Young

最大の違いは、CQRSがコマンドとクエリに別々のデータストアを使用することです。クエリストアは、ドキュメントデータベースなどの別のテクノロジを使用するか、データのクエリを容易にする同じデータベース内の非正規化スキーマにすることができます。

データベース間のデータは通常、サービスバスのようなものを使用して非同期的にコピーされます。したがって、クエリストア内のデータは最終的に一貫性があります(ある時点でそこに存在するようになります)。アプリケーションはそれを考慮する必要があります。同じトランザクション(同じデータベースまたは2フェーズコミット)を使用して両方のストアに書き込むことは可能ですが、通常、スケーラビリティ上の理由から推奨されません。

CQSアーキテクチャは、同じデータストア/テーブルから読み取りと書き込みを行います。

4
Dmitry S.

発明者グレッグ・ヤングの答えを読む

「ディペンデンシーインジェクション」のように、概念は非常に単純であり、当然のことと考えられているので、特にCQRSがしばしばイベントソーシングと一緒に引用されているように、彼らが派手な名前を持っているという事実は、人々が自分が何かよりも大きいと考えるように駆り立てているようです。

  • CQSは、状態を変更するメソッドに読み取るメソッドの分離です。両方を単一の方法で実行しないでください。これはミクロレベルです。

  • CQRSは、この概念をマシンマシンAPI、メッセージモデルの分離、および処理パスのより高いレベルに拡張します。

したがって、CQRSは、APIまたはファサードのコードに適用する原則です。

CQRSは本質的にSOLIDの非常に強力なSであり、開発者の精神に深く隔てられ、より保守性の高いコードを生成できることがわかりました。

表現の転送による状態の変化は、コマンドとクエリが同じ要求と応答の両面であることを意味するため、WebアプリケーションはCQRSには不適切だと思います。表現はコマンドであり、応答はクエリです。

たとえば、注文を送信し、すべての注文のビューを受け取ります。

Webサイトのコードがコマンド側とクエリ側に組み込まれていると想像してください。ルートアクション処理コードは、これらの側面のいずれかに該当する必要がありますが、両方を行います。

強い分離を想像してください。コードが2つの異なるコンパイル可能なコードベースに移動された場合、WebサイトはフォームのPOSTを受け入れますが、ユーザーは別のWebサイトのURLを参照して1つの回避策は常にリダイレクトすることですが、理想的なRESTアプリケーションは次の表現にハイパーテキストが含まれているため、RESTfulではありません。次の状態遷移など。

WebサイトがREST人間とマシン(またはマシンとマシン)の間のAPIである場合、これにはREST APIも含まれますが、他のタイプのHTTPメッセージの受け渡しAPIは、CQRSに最適です。

Webサイトの境界内にあるサービスまたはファサードは、明らかにCQRSでうまく機能しますが、アクションハンドラーはこの境界の外側に配置されます。

WikipediaのCQS を参照してください

3
Luke Puplett
  • CQSはコマンドとクエリに関するものです。モデルは気にしません。データを読み取るだけのサービスと、データを変更するサービスを何らかの形で分離しました。
  • CQRSは、書き込みと読み取りの別々のモデルについてです。もちろん、書き込みモデルを使用すると、ビジネスロジックを満たすために何かを読み取ることがよくありますが、読み取りモデルでのみ読み取りを実行できます。個別のデータベースは最先端です。しかし、OR/Mでモデル化された読み取り用と書き込み用の別々のモデルを持つ単一のDBを想像してください。非常によく十分です。

私は、人々がCQSを持っているときにCQRSを練習するとよく言うことを発見しました。

1
Tomasz Rzepecki