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
6.3k
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
650
Other Decks in Programming
See All in Programming
基礎から学ぶ大画面対応(Learning Large-Screen Support from the Ground Up)
tomoya0x00
0
420
AI Coding Agentのセキュリティリスク:PRの自己承認とメルカリの対策
s3h
0
200
JSONataを使ってみよう Step Functionsが楽しくなる実践テクニック #devio2025
dafujii
1
530
OSS開発者という働き方
andpad
5
1.7k
時間軸から考えるTerraformを使う理由と留意点
fufuhu
16
4.7k
アルテニア コンサル/ITエンジニア向け 採用ピッチ資料
altenir
0
100
250830 IaCの選定~AWS SAMのLambdaをECSに乗り換えたときの備忘録~
east_takumi
0
390
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
320
AWS発のAIエディタKiroを使ってみた
iriikeita
1
180
Amazon RDS 向けに提供されている MCP Server と仕組みを調べてみた/jawsug-okayama-2025-aurora-mcp
takahashiikki
1
110
Ruby Parser progress report 2025
yui_knk
1
440
RDoc meets YARD
okuramasafumi
4
170
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
810
We Have a Design System, Now What?
morganepeng
53
7.8k
Raft: Consensus for Rubyists
vanstee
140
7.1k
Into the Great Unknown - MozCon
thekraken
40
2k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
BBQ
matthewcrist
89
9.8k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.9k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Optimizing for Happiness
mojombo
379
70k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
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