Upgrade to Pro — share decks privately, control downloads, hide ads and more …

忙しいひとのためのCQRS/quickly-cqrs

 忙しいひとのためのCQRS/quickly-cqrs

Mafuyu Kamono

May 17, 2019
Tweet

More Decks by Mafuyu Kamono

Other Decks in Programming

Transcript

  1. © DMM.com 4 $ cat about-me.toml [user] fullname = "Mafuyu

    Kamono" orgnization = "DMM.com LLC" position = "Backend Engineer" detail = "https://mafuyuk.com" twitter-id = "@mafuyuk_m"
  2. © DMM.com CQSとは 11 • Command Query Separation ◦ コマンド・クエリ分離

    • Bertrand Meyer氏が自著内(1997年)で考案した 手法
  3. © DMM.com ここでいう副作用とは? 13 永続化層にあたる部分に対して操作を行い状 態が変化すること 内部ス トレージ 外部ス トレージ

    外部 API キュ ー メソッド 状態が変化するならそ のメソッドは Command! 状態が変化しないなら それはQuery! 常駐インスタン スの属性
  4. © DMM.com CQRSとは 15 • Command and Query Responsibility Segregation

    ◦ コマンド・クエリ責務分離 • Greg Young氏が2010年に考案したパターン ◦ https://cqrs.files.wordpress.com/2010/11/cqrs_documen ts.pdf • CQSを基にしている • CQRSで追加したのはCommandとQueryでまったく 別のモデルを作成するという考え方
  5. © DMM.com CQRSとは(CQRS導入前) 16 data storage IF ドメインモデル データモデル APPサーバー

    CommandとQueryを 持っている カンペ: CommandとQueryで別のモデルを用意する部分についてもうちょい深掘りしてみます CQRSを導入する前はこんな感じでデータモデル1つにCommand、Queryの特性を持ったメソッドが生えてる感じです。 これに対してCQRS要素をちょっとずつ入れていってみます
  6. © DMM.com CQRSとは(CommandとQueryで別のモデル) 17 data storage IF ドメインモデル Commandデータモデル Queryデータモデル

    Commandしかドメイン モデルを介さない APPサーバー カンペ: これが小さいCQRSの実装です。画像のようにCommandデータモデルとQueryデータモデルとして分けてしま います またCommand操作の時のみドメインモデルを介すようにします。この際の恩恵としてはドメインが複雑な場合に、Query 側がドメインモデルを意識しないで済むようにすることで実装がシンプルになります なぜ、意識する必要がないのかというとQueryは副作用がないためです
  7. © DMM.com CQRS(APPサーバーを分けるパターン) 18 data storage IF ドメインモデル Commandデータモデル Queryデータモデル

    IF APPサーバー カンペ: あとはAPPサーバーを分けるパターンがあったり、こちらはCommandサーバーとQueryサーバーを別でスケー ルできるなどスケーラビリティの面で恩恵があったりします
  8. © DMM.com CQRS(Data Storageを分けるパターン) 19 Write側の data storage IF ドメインモデル

    Commandデータモデル Queryデータモデル IF Read側の data storage APPサーバー カンペ: またdata storageを分けるパターンがあったりします このパターンになるとEvent Sourcingの考えを使うことになるのですが時間が足りないため深掘りしません 結果整合性さえ保てば良いドメインに適用するなど、制限があったりするので注意が必要です
  9. © DMM.com 23 参考にした記事の一部 • http://www.minato.tv/cqrs/cqrs_documents_jp.pdf CQRS日本語訳 • https://martinfowler.com/bliki/CommandQuerySeparation.html https://martinfowler.com/bliki/CQRS.html

    • https://martinfowler.com/bliki/EagerReadDerivation.html ご存知、マーチン・ファウラー氏つよつよ • https://docs.microsoft.com/ja-jp/azure/architecture/patterns/cqrs https://docs.microsoft.com/en-us/azure/architecture/guide/architecture-styles/cqrs https://docs.microsoft.com/en-us/previous-versions/msp-n-p/jj554200(v=pandp.10) https://docs.microsoft.com/en-us/previous-versions/msp-n-p/jj591568(v=pandp.10) https://docs.microsoft.com/en-us/previous-versions/msp-n-p/jj591573(v=pandp.10) https://docs.microsoft.com/ja-jp/azure/architecture/patterns/event-sourcing AzureがArchetecture patternをまとめててそこにCQRSも載ってる • http://tanakakoichi9230.hatenablog.com/entry/9613242131 https://www.slideshare.net/koichiromatsuoka/ddd-x-cqrs-orm http://qcontokyo.com/data_2016/pdf/B-2_2_JunichiKato.pdf https://speakerdeck.com/j5ik2o/cqrs-plus-es-zai-ru-men https://cqrs.wordpress.com/documents/building-event-storage/ その他、見て良さげな雰囲気のもの