Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
忙しいひとのためのCQRS/quickly-cqrs
Search
Mafuyu Kamono
May 17, 2019
Programming
1.5k
9
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
忙しいひとのためのCQRS/quickly-cqrs
Mafuyu Kamono
May 17, 2019
More Decks by Mafuyu Kamono
See All by Mafuyu Kamono
GAE 2nd gen (gVisor based GAE) が出たので GAE 導入を決めました/ GAE 2nd gen is good
mfykmn
0
340
GAE SE 2nd Genのススメ/recommend-gae-se-2nd-gen
mfykmn
0
300
Orbsから始めるTerraform生活/ terraform-life-starting-from-orbs
mfykmn
2
730
Other Decks in Programming
See All in Programming
「人を評価する AI」の設計と実装
ryoyanara
0
260
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
1.2k
業務時間外もAIに働いてもらう話
colorful12
2
9.1k
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
130
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
4k
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
420
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
250
T3DD26: From RAGs to Riches
martinhelmich
0
120
FastAPI の並行処理モデルを完全に理解する
hoto17296
9
3.3k
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
290
Oxlintはいいぞ(続)
yug1224
1
490
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
Crafting Experiences
bethany
1
270
The Cult of Friendly URLs
andyhume
79
7k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
560
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
390
ラッコキーワード サービス紹介資料
rakko
1
4.6M
Testing 201, or: Great Expectations
jmmastey
46
8.3k
First, design no harm
axbom
PRO
2
1.3k
Raft: Consensus for Rubyists
vanstee
141
7.7k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
360
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
Transcript
© DMM.com CONFIDENTIAL © DMM.com 忙しい人のためのCQRS 加茂野真冬 - DMM.com LLC
2019.0.517 第二回大新卒LT会
© DMM.com 目標 2 CQRSのことをざっくりでいいので雰 囲気掴んでもらう
© DMM.com 今日話さないこと 3 • CQRSの使用した感想 • CQRSの実装周りの話 • CQRSの深い話
© 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"
© DMM.com CQRSとその文脈で出てきたアーキテクチャたち 5 CQS CQRS DDD Microservices EventSourcing
© DMM.com CQRSとその文脈で出てきたアーキテクチャたち 6 CQS CQRS DDD Microservices EventSourcing CQRSはCQSの考えを元に考案された
© DMM.com CQRSとその文脈で出てきたアーキテクチャたち 7 CQS CQRS DDD Microservices EventSourcing CQRSはドメイン層の分離が行われているアプリ
ケーション、アーキテクチャに対しての提案なの で、DDDの拡張パックのイメージ
© DMM.com CQRSとその文脈で出てきたアーキテクチャたち 8 CQS CQRS DDD Microservices EventSourcing CQRSの実装パターンにMicroservicesに効果
的なパターンがある
© DMM.com CQRSとその文脈で出てきたアーキテクチャたち 9 CQS CQRS DDD Microservices EventSourcing CQRSの提案内で出てくるアーキテクチャ
CQRS + ESのような形でCQRSを拡張するもの
© DMM.com 10 CQS
© DMM.com CQSとは 11 • Command Query Separation ◦ コマンド・クエリ分離
• Bertrand Meyer氏が自著内(1997年)で考案した 手法
© DMM.com CQSとは 12 オブジェクトのメソッドを明確に2つのカテゴリに分け ましょう • Command ◦ 副作用がある操作
◦ 結果を返さない • Query ◦ 副作用がない操作 ◦ 結果を返す
© DMM.com ここでいう副作用とは? 13 永続化層にあたる部分に対して操作を行い状 態が変化すること 内部ス トレージ 外部ス トレージ
外部 API キュ ー メソッド 状態が変化するならそ のメソッドは Command! 状態が変化しないなら それはQuery! 常駐インスタン スの属性
© DMM.com 14 CQRS
© 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でまったく 別のモデルを作成するという考え方
© DMM.com CQRSとは(CQRS導入前) 16 data storage IF ドメインモデル データモデル APPサーバー
CommandとQueryを 持っている カンペ: CommandとQueryで別のモデルを用意する部分についてもうちょい深掘りしてみます CQRSを導入する前はこんな感じでデータモデル1つにCommand、Queryの特性を持ったメソッドが生えてる感じです。 これに対してCQRS要素をちょっとずつ入れていってみます
© DMM.com CQRSとは(CommandとQueryで別のモデル) 17 data storage IF ドメインモデル Commandデータモデル Queryデータモデル
Commandしかドメイン モデルを介さない APPサーバー カンペ: これが小さいCQRSの実装です。画像のようにCommandデータモデルとQueryデータモデルとして分けてしま います またCommand操作の時のみドメインモデルを介すようにします。この際の恩恵としてはドメインが複雑な場合に、Query 側がドメインモデルを意識しないで済むようにすることで実装がシンプルになります なぜ、意識する必要がないのかというとQueryは副作用がないためです
© DMM.com CQRS(APPサーバーを分けるパターン) 18 data storage IF ドメインモデル Commandデータモデル Queryデータモデル
IF APPサーバー カンペ: あとはAPPサーバーを分けるパターンがあったり、こちらはCommandサーバーとQueryサーバーを別でスケー ルできるなどスケーラビリティの面で恩恵があったりします
© DMM.com CQRS(Data Storageを分けるパターン) 19 Write側の data storage IF ドメインモデル
Commandデータモデル Queryデータモデル IF Read側の data storage APPサーバー カンペ: またdata storageを分けるパターンがあったりします このパターンになるとEvent Sourcingの考えを使うことになるのですが時間が足りないため深掘りしません 結果整合性さえ保てば良いドメインに適用するなど、制限があったりするので注意が必要です
© DMM.com 20 ES
© DMM.com ESとは 21 5分LTだったのでESに触れる時間がありません でした...
© DMM.com 22 END. ご清聴ありがとうございました
© 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/ その他、見て良さげな雰囲気のもの