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
18
9.3k
ざっくりCQRS/Event Sourcingを解説する
かとじゅん
October 27, 2020
Tweet
Share
More Decks by かとじゅん
See All by かとじゅん
AIコーディングエージェントの現実と設計品質の重要性
j5ik2o
0
55
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
15
7.2k
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
8
1.2k
メッセージとイベントを中核に置いたシステム設計の有用性について
j5ik2o
12
3.9k
私のキャリアの旅路: 技術をきっかけに変化を楽しむ
j5ik2o
3
930
いかに開発効率と品質を高めるか: ドメイン駆動設計と組織パターンの視点から考える
j5ik2o
5
2.9k
社内のメンバーに「関数型プログラミングの学習・教育」についていろいろ聞いてみた
j5ik2o
2
2.1k
AWS データベースブログの記事 「Amazon DynamoDBによる CQRSイベントストアの構築」 を勝手に読み解く
j5ik2o
2
3.2k
EIPとAkkaについて
j5ik2o
3
2.9k
Other Decks in Programming
See All in Programming
複雑なドメインに挑む.pdf
yukisakai1225
5
1.2k
FindyにおけるTakumi活用と脆弱性管理のこれから
rvirus0817
0
510
テストカバレッジ100%を10年続けて得られた学びと品質
mottyzzz
2
590
Ruby×iOSアプリ開発 ~共に歩んだエコシステムの物語~
temoki
0
300
プロパティベーステストによるUIテスト: LLMによるプロパティ定義生成でエッジケースを捉える
tetta_pdnt
0
330
MCPとデザインシステムに立脚したデザインと実装の融合
yukukotani
4
1.4k
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
410
Reading Rails 1.0 Source Code
okuramasafumi
0
190
The Past, Present, and Future of Enterprise Java with ASF in the Middle
ivargrimstad
0
110
AI時代のUIはどこへ行く?
yusukebe
18
8.9k
1から理解するWeb Push
dora1998
7
1.9k
testingを眺める
matumoto
1
140
Featured
See All Featured
Building an army of robots
kneath
306
46k
Agile that works and the tools we love
rasmusluckow
330
21k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
How to Ace a Technical Interview
jacobian
279
23k
How STYLIGHT went responsive
nonsquared
100
5.8k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
13k
The Pragmatic Product Professional
lauravandoore
36
6.9k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
188
55k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Music & Morning Musume
bryan
46
6.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冊売れた