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 そして現実へ
Search
l-freeze
July 25, 2024
Programming
0
33
CQRS そして現実へ
l-freeze
July 25, 2024
Tweet
Share
More Decks by l-freeze
See All by l-freeze
referential-transparency
lfz
0
5
エンティティリレー
lfz
0
3
Other Decks in Programming
See All in Programming
生成 AI を活用した toitta 切片分類機能の裏側 / Inside toitta's AI-Based Factoid Clustering
pokutuna
0
570
PHP でアセンブリ言語のように書く技術
memory1994
PRO
1
150
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
530
シールドクラスをはじめよう / Getting Started with Sealed Classes
mackey0225
3
390
GitHub Actionsのキャッシュと手を挙げることの大切さとそれに必要なこと
satoshi256kbyte
5
390
Macとオーディオ再生 2024/11/02
yusukeito
0
150
WEBエンジニア向けAI活用入門
sutetotanuki
0
300
PagerDuty を軸にした On-Call 構築と運用課題の解決 / PagerDuty Japan Community Meetup 4
horimislime
1
110
qmuntal/stateless のススメ
sgash708
0
120
ECSのサービス間通信 4つの方法を比較する 〜Canary,Blue/Greenも添えて〜
tkikuc
11
2.3k
Vue3の一歩踏み込んだパフォーマンスチューニング2024
hal_spidernight
3
3.1k
GCCのプラグインを作る / I Made a GCC Plugin
shouth
1
150
Featured
See All Featured
Imperfection Machines: The Place of Print at Facebook
scottboms
264
13k
Building an army of robots
kneath
302
42k
Product Roadmaps are Hard
iamctodd
PRO
48
10k
How STYLIGHT went responsive
nonsquared
95
5.2k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
46
2.1k
Statistics for Hackers
jakevdp
796
220k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
9
680
Docker and Python
trallard
40
3.1k
5 minutes of I Can Smell Your CMS
philhawksworth
202
19k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
92
16k
Making Projects Easy
brettharned
115
5.9k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
Transcript
CQRS そして現実へ…
CQRSって聞いたことありますか?
CQRSとは? CQRS はコマンド クエリ責務分離を表し、データ ストアの読み取りと更新の操作を分離 するパターンです。 参考:https://learn.microsoft.com/ja-jp/azure/architecture/patterns/cqrs
コマンド? クエリー? 責務分離は医師 と薬剤師の事ね
コマンドとは? 副作用のある操作の事 副作用とは? DBの更新や、ログの出力、ファイルの新規作成など・・・ 具体例は? DBならINSERT/UPDATE/DELETEなど
クエリーとは? なにかを参照する操作の事 参照とは? DBの取得や、ログの表示、ファイルの読み込みなど・・・ 具体例は? DBならSELECTなど
クエリーは・・・ タダ!(見るだけなら) タダ!!!(金欠)
コマンドは・・・ 実行すると・・・ 副作用が!!!
コマンドは・・・!!! 実行すると・・・ 副作用が!!!
コード例 (Not CQRS)
部屋を予約する(Not CQRS) もしかして:MVC MVCアーキテクチャーで作られたものは100%CQRSではありません。 (サンプルコードはありません 😞)
コード例 (CQRS)
部屋を予約する(CQRS) 各ファイルの説明 apis/reservation/command/Room.ts 部屋の予約に関するコマンド ソース配置 apis/reservation/query/RoomQuery.ts 部屋の情報(広さなど)に関するクエリー apis/reservation/query/RoomRankQuery.ts 部屋の情報(広さなど)に関するクエリー apis/pages/apiCaller.ts
上記の呼び出し元
apis/reservation/command/Room.ts 部屋予約 予約取り消し 部屋の変更
apis/pages/apiCaller.ts クエリー コマンド
apis/reservation/query/RoomRankQuery.ts,RoomQuery.ts 空き部屋のランク一 覧を取得 部屋のランク一覧を 取得 部屋情報を取得
何が嬉しい?(Query) • ランク情報取得や空き部屋のランク情報取得など、情報取得系の操作はとにかく Queryと書かれているソースを見ればいい • 取得・参照処理だったらQueryを見れば良い、という事だけ覚えておけば良い • だから機能改修で取得結果を変更したい時は何も考えずにQueryだけを触れば良 い •
取得した結果が正しい事だけをテストすれば良い! • 副作用が無いから何回実行しても良い!
何が嬉しい?(Command) • コマンド名を見れば何をするのか分かる! • 副作用が発生する処理だという事が分かる! ◦ なので無闇に実行してはいけない事が分かる。 ◦ なので機能改修で修正が必要な場合は自然と緊張感が増す。 •
副作用の結果も考慮してテストする必要がある事が分かる。
現実の例 (Not CQRS)
プログラム教えて 来客です どうされますか? 税理士に提出して 決算報告書提出して 資料できました! どうですか? 決算は丁寧確認して、 貸借対照表と簿記は提出 してOK、資料はプログラム
の後で、来客対応先にして・・・ 💦
現実の例 (CQRS)
プログラム教えて 来客です どうされますか? 資料できました! どうですか? こいつら全部クエリー やな、ナンボ来ても良 さそうや
税理士に提出して 決算報告書提出して う、副作用のあるもの ばかり、これはコマンド ね 提出結果も確認しな きゃ
何が嬉しい?(現実) 副作〆
まとめ • クエリーとコマンドは分ける • クエリーは何度実行しても問題無い • コマンドは副作用が発生する
余談
気を付けること ここまでの話は機能に限ったものです。それ以外に関しては一切考慮をしていません。
気を付けること、それは非機能要件 クエリーも何度も実行し続ければ負荷が掛かります。同時に実行する数が多ければ極 端に負荷が掛かります。負荷に耐えられなければシステムは死んでしまいます。 これを機能に関係ない要件、非機能要件と言います。 非機能要件にも注意を払いながらCQRSしていきましょう。
おしまい そして現実へ…