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/Event Sourcingを解説する
Search
かとじゅん
October 27, 2020
Programming
9.6k
18
Share
ざっくりCQRS/Event Sourcingを解説する
かとじゅん
October 27, 2020
More Decks by かとじゅん
See All by かとじゅん
終盤で崩壊させないAI駆動開発
j5ik2o
3
2.7k
CQRS/ESになぜアクターモデルが必要なのか
j5ik2o
0
2k
メッセージ駆動が可能にする結合の最適化
j5ik2o
10
6.9k
曖昧なプロンプトでも正しいコードが書ける理由
j5ik2o
0
510
AIコーディングエージェントの現実と設計品質の重要性
j5ik2o
0
150
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
17
8.3k
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
8
1.7k
メッセージとイベントを中核に置いたシステム設計の有用性について
j5ik2o
12
4.4k
私のキャリアの旅路: 技術をきっかけに変化を楽しむ
j5ik2o
3
1.1k
Other Decks in Programming
See All in Programming
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
180
自動レビューエンジンの実装と運用 ~レビューのない世界へ~
kurukuru1999
2
300
AI時代のUIはどこへ行く?その2!
yusukebe
16
5.1k
Modding RubyKaigi for Myself
yui_knk
0
830
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
760
サーバーレスで作る、動画データ管理基盤
oyasumipants
0
320
プラグインで拡張される Context をtype-safe にする難しさと設計判断
kazupon
2
500
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
420
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
140
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
250
Oxlintはいかにしてtsgolintのlint ruleを呼び出しているのか
syumai
2
1k
Featured
See All Featured
Being A Developer After 40
akosma
91
590k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.2k
Navigating Team Friction
lara
192
16k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
550
The SEO identity crisis: Don't let AI make you average
varn
0
480
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.3k
We Are The Robots
honzajavorek
0
240
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Designing for Timeless Needs
cassininazir
1
240
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
The browser strikes back
jonoalderson
0
1.1k
Leo the Paperboy
mayatellez
7
1.8k
Transcript
ざっくり CQRS/Event Sourcing を解説する かとじゅん(@j5ik2o) 設計ナイト2020
DDDに関係はしますが、 ドメインモデルそのものではなく 分散システムの設計パターンについて 話します
誰? • Chatworkで仕事してます。現在は分散システムの設計・実装を担当しています。 • 2016年からk8s+Akka+Kafka+HBaseを用いた、CQRS/Event Sourcingシステム を運用しています。 • 現在もAkka-Clusterへのマイグレーションを計画中
DDDによるクエリサイドのペインについて これらのペインを飲み込めるの であれば、CQRSを採用する 必要はない
C/Qの独立した最適化ができないか? それがCQRSだ
CQRSとは • Command and Query Responsibility Segregation=コマンド・クエリ責務分離 ◦ (2010年 Greg
Young氏) • コマンドとクエリをスタックごと隔離すること。単なるモデルの分離ではない。Event Sourcingとセットで採用されることが多い。 • Greg Young氏の論文でも隔離のための境界があると明示されている • コマンドはDDDのドメインモデルを内包することを想定している。というか、DDDの ために考えられたパターン。CQRSである=DDDを採用していることになる。 • モデルだけ分離して、隔離の境界がないものはCQRSと呼んではいけない(個人の 解釈) とはいえ、CQRSですべてが解決されるわけではない
CQRS/Event Sourcingのイメージ スナップショット ストレージ 必要に応じてVOを使ってリード モデルを構築する
イベントをどう使うのか • 理解を促すための擬似コー ド。CRUDよりレイテンシが悪 化する例なので真似しないよ うに…。 • エンティティのライフサイクル をリクエストスコープから分離 する必要がある。そのために
Actorを使う
「えっ、複雑やんけっ…」 一旦落ち着こう
なぜC/Qをわけるのか • そもそもCとQで要件が異なるので、混ぜないで隔離するほうが望ましい。 • ただし、データ形式がクライアント要求に合わせる必要がなければC/Qを分けなくて もよい。そういう案件に巡り会えたことがないが…。 コマンド クエリ 一貫性/可用性 一貫性重視。最新の書き込みが反映され
るなければならない。トランザクション整合 性(強い整合性)を使う 可用性重視。つまりちょっと古いデータ見 えてもよい。結果整合性 (弱い整合性)を使 う データ形式 正規化されたデータを保存する (集約単位 ≒概念単位) 非正規化されたデータ形式取得する (クラ イアント要求に合わせる ) スケーラビリティ 全体のリクエストに対して少ない比率。必 ずしもスケーラビリティは重要ではない 全体のかなりのリクエスト比率を占めるた め、スケーラビリティが必要
CQRSの利点と欠点 • 利点 ◦ コマンドとクエリに分離されており独立しているため、耐障害性を確保しやす く、デプロイサイクルも別にできる ◦ コマンドとクエリを必要に応じて個別に最適化できる。別々にスケールさせるこ とができる •
欠点 ◦ コストがかかる。目的ごとにスタックを分離するので、構成要素が多くなる。 ◦ CQRSは従来と比べると複雑と揶揄されることが多いが、従来モデルではC/Q が混在することの複雑があったが、CQRSではある意味シンプルになってい る。が全体の構成要素は複雑なる。 ▪ つまり、単体のオブジェクトとしてはシンプルになるが、ネットワークとして は複雑になるということ
• CQRSでは、ドメインオブジェクトはドメインロジックを実行するためのシンプルなモデ ルとなる。ただし、全体の構造は複雑になる CQRSでモデルがどう変わるか メッセージの本文を持 つのはつらい メッセージの本文を保 持しなくてよい
非Event SourcingでのCQRSはいろいろ難しい • ドメインオブジェクトが計算する値 はそもそも永続化されていない。 その値がリードモデルで必要な 場合、DBトリガで更新を通知して SQLでリードモデルを構築できな い •
リードモデル更新プロセスを採用 する場合、DBとは別途キューを 必要とする。結局Eventに頼るこ とになる。 • できるだけダブルコミットを避けて、障害でノードが消失しても再開できるようにイベント は永続化される必要がある。Event Sourcingではイベントを真のデータソースにす る。 スケーラビリティの観点でポーリ ングが難しいので、 pub/subを利 用する
CQRS/ES対応分散システムフレームワーク • Akka https://akka.io (Scala, Java) • Akka.NET https://getakka.net/ ,
https://akkatecture.net/ (.NET) • proto.actor https://proto.actor/ (Golang, .NET, Java/Kotlin) ◦ リアクティブシステムが作れそうなのは Golangのみ 11k starts, 2010~ 3.3k starts, 2016~ 3.7k starts, 2014~
完全にC/Qを分けるのは無理… クエリサイドのペインも 許容できないんだけど…
境界を引かない=非CQRSにする(現実解) • クエリでは一切リポジトリを利用しない。ただしVOに依存することがある • リポジトリはドメインロジックのために使う(findById, store, deleteのみ)
FYI: Scala/Akkaを学ぶための薄い本を売ってます • Scala 2.13とAkka 2.6(Akka-Typed)で解説しています。 10冊売れた 29冊売れた