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
6.6k
0
Share
How we made a financial system using Cats Effect, FS2, and doobie in FOLIO
Yuki Ishikawa
September 25, 2020
More Decks by Yuki Ishikawa
See All by Yuki Ishikawa
Dependency Injection in Scala
rideryi
0
680
Other Decks in Programming
See All in Programming
決定論 vs 確率論:Gemini 3 FlashとTF-IDFを組み合わせた「法規判定エンジン」の構築
shukob
0
170
色即是空、空即是色、データサイエンス
kamoneggi
1
140
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
290
Modding RubyKaigi for Myself
yui_knk
0
370
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
1
320
Are We Really Coding 10× Faster with AI?
kohzas
0
200
My daily life on Ruby
a_matsuda
3
420
サーバーレスで作る、動画データ管理基盤
oyasumipants
0
230
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
0
230
Agent Skills を社内で育てる仕組み作り
jackchuka
1
2.2k
AI Agent と正しく分析するための環境作り
yoshyum
2
560
Skillは並べた。動かなかった。契約で繋いだ。— 65個のSkillから、自走する開発サイクルへ
junholee
0
680
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
515
110k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
180
The Pragmatic Product Professional
lauravandoore
37
7.3k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.6k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
370
Evolving SEO for Evolving Search Engines
ryanjones
0
200
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
A Soul's Torment
seathinner
6
2.8k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
350
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.7k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.5k
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