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

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

1b2f947fa8eaca14fad6af02d4022364?s=128

Mafuyu Kamono

May 17, 2019
Tweet

Transcript

  1. © DMM.com CONFIDENTIAL © DMM.com 忙しい人のためのCQRS 加茂野真冬 - DMM.com LLC

    2019.0.517 第二回大新卒LT会
  2. © DMM.com 目標 2 CQRSのことをざっくりでいいので雰 囲気掴んでもらう

  3. © DMM.com 今日話さないこと 3 • CQRSの使用した感想 • CQRSの実装周りの話 • CQRSの深い話

  4. © 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"
  5. © DMM.com CQRSとその文脈で出てきたアーキテクチャたち 5 CQS CQRS DDD Microservices EventSourcing

  6. © DMM.com CQRSとその文脈で出てきたアーキテクチャたち 6 CQS CQRS DDD Microservices EventSourcing CQRSはCQSの考えを元に考案された

  7. © DMM.com CQRSとその文脈で出てきたアーキテクチャたち 7 CQS CQRS DDD Microservices EventSourcing CQRSはドメイン層の分離が行われているアプリ

    ケーション、アーキテクチャに対しての提案なの で、DDDの拡張パックのイメージ
  8. © DMM.com CQRSとその文脈で出てきたアーキテクチャたち 8 CQS CQRS DDD Microservices EventSourcing CQRSの実装パターンにMicroservicesに効果

    的なパターンがある
  9. © DMM.com CQRSとその文脈で出てきたアーキテクチャたち 9 CQS CQRS DDD Microservices EventSourcing CQRSの提案内で出てくるアーキテクチャ

    CQRS + ESのような形でCQRSを拡張するもの
  10. © DMM.com 10 CQS

  11. © DMM.com CQSとは 11 • Command Query Separation ◦ コマンド・クエリ分離

    • Bertrand Meyer氏が自著内(1997年)で考案した 手法
  12. © DMM.com CQSとは 12 オブジェクトのメソッドを明確に2つのカテゴリに分け ましょう • Command ◦ 副作用がある操作

    ◦ 結果を返さない • Query ◦ 副作用がない操作 ◦ 結果を返す
  13. © DMM.com ここでいう副作用とは? 13 永続化層にあたる部分に対して操作を行い状 態が変化すること 内部ス トレージ 外部ス トレージ

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

  15. © 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でまったく 別のモデルを作成するという考え方
  16. © DMM.com CQRSとは(CQRS導入前) 16 data storage IF ドメインモデル データモデル APPサーバー

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

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

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

    Commandデータモデル Queryデータモデル IF Read側の data storage APPサーバー カンペ: またdata storageを分けるパターンがあったりします このパターンになるとEvent Sourcingの考えを使うことになるのですが時間が足りないため深掘りしません 結果整合性さえ保てば良いドメインに適用するなど、制限があったりするので注意が必要です
  20. © DMM.com 20 ES

  21. © DMM.com ESとは 21 5分LTだったのでESに触れる時間がありません でした...

  22. © DMM.com 22 END. ご清聴ありがとうございました

  23. © 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/ その他、見て良さげな雰囲気のもの