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+ESをKinesis,Spark,RDB,S3でやってみた
Search
machu
July 18, 2019
Technology
0
3.4k
CQRS+ESをKinesis,Spark,RDB,S3でやってみた
machu
July 18, 2019
Tweet
Share
More Decks by machu
See All by machu
NBAチームから学ぶ強いチームの作り方
machuz
0
47
Authorization to implement with Extensible Effect
machuz
0
420
アルプの 認証/認可分離戦略と手法
machuz
3
750
AuthzCtx - Alp社内共有会
machuz
0
77
アルプのEff独自エフェクト集 / Alp-original ’Eff’ pearls
machuz
1
2.1k
Scalebaseバックエンド構成について/the backend design of Scalebase
machuz
0
6.4k
SQL Meisterへの道 ~更新編~ / sql-meister-CUD
machuz
0
2.3k
SQL Meisterへの道 ~基礎〜参照編~ / sql-meister-R
machuz
0
2.6k
Authz
machuz
0
310
Other Decks in Technology
See All in Technology
非エンジニアのあなたもできる&もうやってる!コンテキストエンジニアリング
findy_eventslides
3
870
SOC2取得の全体像
shonansurvivors
1
350
GopherCon Tour 概略
logica0419
2
160
Pythonによる契約プログラミング入門 / PyCon JP 2025
7pairs
5
2.4k
Great flattening、開発チームから見る景色
o8n
0
100
VCC 2025 Write-up
bata_24
0
150
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
11
77k
非同期処理実行基盤 Delayed脱出 → Solid Queue完全移行への旅路。
srockstyle
3
1.6k
それでも私はContextに値を詰めたい | Go Conference 2025 / go conference 2025 fill context
budougumi0617
4
1.1k
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
3
20k
KMP の Swift export
kokihirokawa
0
280
自作LLM Native GORM Pluginで実現する AI Agentバックテスト基盤構築
po3rin
2
220
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.7k
The World Runs on Bad Software
bkeepers
PRO
71
11k
The Pragmatic Product Professional
lauravandoore
36
6.9k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.1k
Documentation Writing (for coders)
carmenintech
75
5k
A designer walks into a library…
pauljervisheath
208
24k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
GraphQLとの向き合い方2022年版
quramy
49
14k
Balancing Empowerment & Direction
lara
4
670
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Raft: Consensus for Rubyists
vanstee
139
7.1k
Transcript
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた CQRS+ESを Kinesis,Spark,RDB,S3でやってみた @ma2k8 Tsubasa Matsukawa スタディサプリ/Quipper Product Meetup
#3
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた About me @ma2k8 Tsubasa Matsukawa スタディサプリEnglishのサーバーサイドとインフラを 担当しています。 2
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた Agenda | 01 CQRSとは 02 EventSourcingとは 03 CQRS+ESとは
04 スタディサプリENGLISHにCQRS+ESを導入する前の課題 05 CQRS with Embulkの導入 06 Spark,Kinesis,S3,RDBでCQRS+ES 07 まとめ 3
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた CQRSとは 01 4
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた コマンドクエリ分離原則 ~ Command and Query Responsibility Segregation ~
➔ ざっくりいうと ◆ Commandは副作用を伴う処理(更新系) ◆ Queryは値だけ返す処理(参照系) ◆ この2つをわけようという考え(CQS)をアーキ テクチャへ適用したもの 5
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた メリット ➔ 参照はページングが必要なケースも多く、更新系のときと同じロジックで組み 立てるのはかなりしんどいので、参照する時の形で保存し、値を取って返だ けにすることでシンプルにできる ➔ これによりアプリケーションのコードがシンプルになり、参照系の計算量もか なり減る
➔ 一定以上の規模、複雑さを持つアプリケーションではかなり有用なアプロー チとなる 6
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた たとえば・・・・? 7
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた ゲームの巨大ロボットの部位破壊を例にしてメリットの一部を紹介 ➔ 攻撃を受けてHPを減少させる処理(更新系)は、どの箇所に受けたダメージ か、その箇所はすでに破壊済みか(壊れていたらHPの減少なし)などのロ ジックを挟むので各部位の現状の状態を計算しないといけない ➔ しかし、全体のHPを表示する(参照系)のに更新系に必要なロジックを挟むの は煩雑で、部位数が多いと重くなってしまうので、更新系が走るタイミングで
全体のHPをどこかに保存しておくことで参照系がシンプルになります 8
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた デメリット ➔ Command/Queryの保存先、同期の方法を考える必要がある 9
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた EventSourcingとは 02 10
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた Event Sourcing ➔ データではなく、イベントを主役とするパターン ➔ 発生するイベントはすべて記録し、基本的に追加しかしない ➔ 対となる概念は「State
Sourcing」 11
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた メリット ➔ State Sourcingでは消えてしまう、有用な履歴情報をすべて残せる ➔ 後で「あの情報欲しいな」と思い直したときに、積み上げたEventから好きな 状態に復元することができる ➔
Eventをhookに様々な処理が書ける。マイクロサービス文脈でも有用 12
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた デメリット ➔ Eventの数が多くなると状態を計算する処理のコ ストが大きい ➔ 任意のタイミングでスナップショットデータをつくっ て回避する 13
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた CQRS+ESとは 03 14
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた CQRS+ES ➔ CommandとQueryの結合をEventで行う ➔ QueryをEvent契機で更新していく ➔ Queryはカウンターキャッシュ的に更新されていくイメージ 15
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた 16
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた スタディサプリEnglishに CQRS+ESを導入する前の課題 04 17
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた データの持ち方 ➔ スタディサプリENGLISHではリリース当初から学習ログをEvent Sourcingで RDBに保存する設計になっていた ◆ 立ち上げ期の保存場所としては妥当 ◆
State Sourcingに振っていないのでデータが残っている点もGood ➔ その学習ログを都度集計してクライアントがほしい形に加工していた 18
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた データが増え、つらみが・・ ➔ 学習者のグループを管理する要件が追加され、学習履歴一覧ページが誕生 してしまい、都度集計の重さが実用に耐えなくなってしまった ➔ ただ表示したいだけなのにロジックもめちゃくちゃ複雑 ➔ 集計しないと学習状況がわからないので、学習日数などでソートしてページ
ングするのに、全学習者分の集計が必要となり、重・・・・ 19
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた これではスケールしない 20
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた CQRS with Embulkの導入 05 21
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた スケールしないので、 まずは簡単にCQRSを初めてみた 22
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた 23
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた API 軽くなった 24
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた だが・・・・ 25
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた 一時しのぎのCQRS ➔ APIは軽くなったが、Embulkでの集計処理はデータ量に応じて重くなる ➔ 導入後1年ほどして、集計に1時間を超えるようになってしまった ➔ 結果反映が1h以上おくれるので、ユースケースもかなり限られる ➔
Embulkはとても便利で大好きなツールですが、集計用の巨大な生SQLは ちょっとメンテしにくい 26
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた Spark,Kinesis,S3,RDBでCQRS+ES 06 27
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた それぞれの要素を軽く紹介 ※RDBとS3は除く 28
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた Kinesisとは ➔ マネージドなリアルタイムストリーム基盤 ➔ Consumerを自分で書けるKinesis Data Streamsと、Consumerを書かな いでもs3等、特定の箇所に突っ込んでくれるKinesis
Data Firehoseがある ➔ at-least-once 29
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた Sparkとは ➔ Scalaで書かれた並列分散処理フレームワーク ➔ Hadoop MapReduceのDisk IOが重い弱点を、データをオンメモリで処理 することにより解決した
➔ 繰り返し処理、リアルタイム処理などにかなり強い ➔ Scalaで直感的に並列分散処理が書くことができて素敵 30
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた SparkはEMR上で動かしています 31
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた EMRとは ➔ Hadoop,Hive,Sparkなどのクラスタをマネージドに立ち上げることができる マネージドクラスタプラットフォーム ➔ 構築、保守がとても面倒な大規模分散処理基盤をお手軽に立ち上げ、実行 することができ、S3,Dynamo,Redshift等のAWSサービスへのインテグレー ションも容易
32
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた これらを使ってCQRS+ESを 効率よくやる 33
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた Command,Query,Eventの保存場所 ➔ Commandはトランザクション整合性で正規化されたデータを保存する ➔ Queryは結果整合性で、非正規化されたクライアント都合のデータを保存す る ➔ Eventは大量のデータをスキーマレスに保存する
➔ Command,QueryはRDB、EventはS3へ保存することにした 34
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた S3はいいぞ ➔ S3は書き込みを`Prefix毎に3500req/sec` 捌ける ➔ AWSはS3をHubにいろんなサービスへ展開しやすい ➔ 可用性99.99%
耐久性イレブンナイン ➔ 安い ➔ `Full managed object storage` 容量キニシナイ 35
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた Kinesisはイベントの伝播 SparkはQueryの集計で使う 36
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた Kinesis 37 ➔ 状態を都度更新するので、計算コストがかからない
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた Spark 38 ➔ 全Eventを利用した状態の復元や、スナップショット作成は Sparkで高速に行う
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた 切り替えも安心安全 39
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた 並行稼動させ、データに問題がないことが確認できたら切り替える 40
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた まとめ 07 41
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた CQRS+ESは便利 42
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた EventはS3においておくと 分析などで再利用しやすい 43
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた EMR,Spark,Kinesisは 大規模と戦う際にとても有用 44
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた 45
#sapurimeetup CQRS+ESをKinesis,Spark,RDB,S3でやってみた ご清聴ありがとうございました 46