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
720
Other Decks in Programming
See All in Programming
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
3.3k
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
150
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
160
yield再入門 #phpcon
o0h
PRO
0
860
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
420
メールのエイリアス機能を履き違えない
isshinfunada
0
200
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
970
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
480
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
630
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
9
5.9k
Foundation Models frameworkで画像分析
ryodeveloper
1
320
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
620
Featured
See All Featured
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
470
Game over? The fight for quality and originality in the time of robots
wayneb77
1
230
Paper Plane (Part 1)
katiecoart
PRO
1
10k
Typedesign – Prime Four
hannesfritz
42
3.1k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Scaling GitHub
holman
464
140k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
A better future with KSS
kneath
240
18k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
200
YesSQL, Process and Tooling at Scale
rocio
174
15k
Code Reviewing Like a Champion
maltzj
528
40k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
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/ その他、見て良さげな雰囲気のもの