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
How we made a financial system using Cats Effec...
Search
Yuki Ishikawa
September 25, 2020
Programming
0
5.7k
How we made a financial system using Cats Effect, FS2, and doobie in FOLIO
Yuki Ishikawa
September 25, 2020
Tweet
Share
More Decks by Yuki Ishikawa
See All by Yuki Ishikawa
Dependency Injection in Scala
rideryi
0
630
Other Decks in Programming
See All in Programming
なまけものオバケたち -PHP 8.4 に入った新機能の紹介-
tanakahisateru
1
120
testcontainers のススメ
sgash708
1
120
Refactor your code - refactor yourself
xosofox
1
260
たのしいparse.y
ydah
3
120
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
180
今年のアップデートで振り返るCDKセキュリティのシフトレフト/2024-cdk-security-shift-left
tomoki10
0
200
RWC 2024 DICOM & ISO/IEC 2022
m_seki
0
210
Cloudflare MCP ServerでClaude Desktop からWeb APIを構築
kutakutat
1
540
創造的活動から切り拓く新たなキャリア 好きから始めてみる夜勤オペレーターからSREへの転身
yjszk
1
130
Mermaid x AST x 生成AI = コードとドキュメントの完全同期への道
shibuyamizuho
0
160
Recoilを剥がしている話
kirik
5
6.6k
KubeCon + CloudNativeCon NA 2024 Overviewat Kubernetes Meetup Tokyo #68 / amsy810_k8sjp68
masayaaoyama
0
250
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
BBQ
matthewcrist
85
9.4k
Typedesign – Prime Four
hannesfritz
40
2.4k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Building an army of robots
kneath
302
44k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
4 Signs Your Business is Dying
shpigford
181
21k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Producing Creativity
orderedlist
PRO
341
39k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Transcript
1 FOLIOでCats Effect, FS2, doobieを使って 証券システム作ってみた 2020/09/25 Scala.tokyo @rider_yi Copyright
© 2020 FOLIO Co., Ltd. All Rights Reserved.
ABOUT ME 2 ⽯川裕樹 (Yuki Ishikawa) @rider_yi - 2019年1⽉⼊社 -
株とか全然詳しくなかったけど、フィンテックに興味が あり⼊社。FOLIOに⼊ってから投資を始めた - 証券基盤部で証券システムの裏側を作ってる - Scala歴6年くらい
FOLIO?
FOLIOָ䲿⣘ׅ4אך؟٦ؽأ ػحءـ 麊欽 ،ؙذ؍ـ 麊欽 剑⡚䫎项겘 ⡚ 剑⡚䫎项겘 넝
5 -証券基盤部の技術スタック -Cats Effectの世界に移⾏した3つの理由 -新プロジェクトでCats Effect, FS2, doobieを導⼊した話 今⽇話すこと
証券基盤部の技術スタック 6
7 証券基盤部の技術スタック - 100% Scala - マイクロサービス - (最近まで)全てFinagleで開発
従来の主な使⽤ライブラリ 8 Finagle -Twitter社が作ったRPCシステム Finatra -Finagle上にアプリケーションを構築するためのフレームワーク -HTTP, Thriftサーバーが簡単に書ける -guiceベースのランタイムDI -DIだけ使ったバッチも書ける
(com.twitter.inject.App) Quill -DSLからコンパイル時にクエリを⽣成してくれるDBアクセスライブラリ -finagle-mysql上で動かすことができる (JDBCやCassandra版などもある)
Cats / Cats Effect -ScalaにFunctor,Monadなどを持ち込むためのライブラリ -Cats EffectはCatsのMonadErrorから⽣やしたIOを提供するライブラリ FS2 -Cats系のStreaming I/Oライブラリ
doobie - Cats系のJDBC Wrapper - ⽂字列補間⼦でSQLをそのまま書くタイプ 現在の主な使⽤ライブラリ 9
Cats Effectの世界に移⾏した 3つの理由 10
11 Quillの代わりにdoobieを使いたかった 理由①
DSLで書くのがつらかった 12 - 証券システムでは、帳票出⼒などで複雑なSQLを実⾏する必要がある - 実⾏したい複雑なSQLを⽣成させるDSLを書くのが難しく、時間を溶かす ⼈が多かった
QuillのシンプルなDSLならワークするが… 13 Compile
複雑なSQLはDSLで更に難読化する 14 ※このDSLはまだ簡単な⽅です
quill-finagle-mysqlの問題 15 BATCH INSERTに対応していないため、⼤量データの書き込みに時 間がかかる(JDBC版なら問題なし) quill-finagle-mysql: wrong batch insert action
behaviour #747 - getquill / quill
doobieの選定理由 16 - SQLがそのまま書ける - ⾃分が前職で使っていたので結構詳しかった - 証券基盤部は強いScalaエンジニアが多く、Catsに詳しい メンバーも何⼈かいるので⼊れても問題ないと判断した -
我々のシステムはほとんどバッチなので、Non-blocking I/OではなくJDBCで⼗分だった
17 doobieの簡単なサンプル
18 doobieの簡単なサンプル
19 doobieの簡単なサンプル
20 バッチをストリーム化したかった 理由②
⼀般的なFOLIOのバッチ 21 - 計算量が少ないバッチは全件取得して計算しても問題なし Step 1 Step 2 Step 3
Step 4 処理対象 データ取得 処理済み データ除外 計算 計算結果 永続化 DB 全件書込 全件取得 DB STEP① STEP② STEP③ STEP④
計算量の多いバッチでやりたいこと - 計算量が多いバッチはチャンク毎に処理させたい - Functionalに書けるソリューションとしてストリームを採⽤したくなった ※quillでも書けるけど前述の理由でquillはやめたかった Step 1 Step 2
Step 3 Step 4 処理対象 データ取得 処理済み データ除外 計算 計算結果 永続化 DB N件書込 N件取得 DB STEP① STEP② STEP③ STEP④ 全件完了するまでN件の処理をループ
ストリーム処理ライブラリ 23 doobieがFS2をネイティブサポートしているため、 DBから分割取得するストリームが簡単に作れる!
doobieはFS2をネイティブサポート 24 Query0#streamでDBから⼀度にN件fetchして、 メモリに蓄えて1件ずつ下流に流すFS2のfs2.Streamが得られる - streamはstreamWithChunkSize(512)のエイリアス - JDBCのResultSetから⼀度に何件取得するか
FS2 vs Akka Streams 25 FS2 - Pullベースなので拡張しやすい - 処理効率的にはPushベースのストリームに劣る(monix-reactiveのドキュメントによると)
- Cats Effectに依存している Akka Streams - Reactive streams - Pushベース (バックプレッシャー) - AkkaのActorフレームワークに依存している
26 理由③ この話はまた別の機会に RPCを使わなくなったため、 Finagleを使い続ける理由があまり無かった
新プロジェクトで Cats Effect, FS2, doobie を導⼊した話 27
28 新プロジェクト - 開発メンバー: 10⼈以上 - 開発期間: 9ヶ⽉ - FOLIOのロボアド基盤を刷新する巨⼤プロジェクト
複雑なドメインと戦いながらロボアド基盤をリプレースするときにした⼯夫 - Inside Fintech Meetup
29 ⽴ち上げメンバーでどう書くか相談した - RPCが減ったのでFinagle依存を減らしてCatsエコシステムに移⾏するこ とで同意が取れた - Effect WrapperはCats EffectのIOに決定 ⇨
公式ドキュメントが充実してるから ⇨ 他のWrapperを採⽤したとしてもCats EffectのType Classの理解は必要
30 課題 - ラーニングカーブをどう抑えるか - どうやってメンバーにライブラリを布教するか - 強いエンジニアが多いとはいえ、全員がCatsやFS2に詳しいわけではない - 皆で同じように書けるコーディングスタイルを決めたい
31 ラーニングカーブを抑えるためにルールを決めた - Tagless-Finalは使わない - DI・バッチの基底クラス等はFinatraを継続して使う ⇨いずれ変えるけど今じゃなくて良いという判断 ⇨リソース開放がイベントハンドラー⽅式なのでcatsのResourceと相性が悪い
32 どうチームに布教したか 勝⼿に浸透していったのであまり努⼒してない…
33 Aさん「⼟⽇でCats完全理解した」 Bさん「FS2の完全理解doc書いたよ」 みんな強かった
布教のためにやったこと(強いて⾔えば…) 34 - ⽴ち上げメンバーで開発の⼟台と最初の⾒本となるバッチを作った - 詳しい⼈に質問したり「ペアプロしませんか」を⾔える雰囲気を⼤事に した
35 FS2でのバッチの書き⽅を決めた 各ステップをStreamまたはPipeを返すクラスに分割
36 FS2でのバッチの書き⽅を決めた 各ステップをthroughで連結してバッチを構築
37 移⾏してよかったか よかった! - エコシステムを⼀気に変えたので最初は開発スピードが落ちたが、課題 はしっかり解決されたし、徐々にスピードも取り戻せた。 - 今後も使い続けたい・全てのサービスをCats Effect, FS2,
doobieで置き 換えたいというフィードバックがあり嬉しい
新プロジェクトは 今年7⽉14⽇に無事リリース 38
39 FOLIOはCats Effect, Doobie, FS2で動いてます
(おまけ) doobieからRob Norrisさん(作者)が 離れてしまった話 40
まだdoobieの利⽤者は多いと思っている 41 Scalar 2020 whiteboard voting
現状はわりと楽観的 42 - 今のところ不満なく使えている - ScalaやCatsのアップデートに追従できなくなったら同じようなコンセプ トの別ライブラリに移⾏しようねという話をしてる
作者はSkunkの開発をしている 43 今からPostgreSQLで使うなら Skunkのほうが良さそう https://github.com/tpolecat/skunk
Scalaエンジニア募集中! 44
※開発⾔語はScalaですが、⼊ってから覚えた⼈もたくさん居ます! お気軽に採⽤ページからカジュアル⾯談のお申し込みを! https://corp.folio-sec.com/thespecialone/jobs/
THANK YOU