How we made a financial system using Cats Effect, FS2, and doobie in FOLIO
by
Yuki Ishikawa
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
1 FOLIOでCats Effect, FS2, doobieを使って 証券システム作ってみた 2020/09/25 Scala.tokyo @rider_yi Copyright © 2020 FOLIO Co., Ltd. All Rights Reserved.
Slide 2
Slide 2 text
ABOUT ME 2 ⽯川裕樹 (Yuki Ishikawa) @rider_yi - 2019年1⽉⼊社 - 株とか全然詳しくなかったけど、フィンテックに興味が あり⼊社。FOLIOに⼊ってから投資を始めた - 証券基盤部で証券システムの裏側を作ってる - Scala歴6年くらい
Slide 3
Slide 3 text
FOLIO?
Slide 4
Slide 4 text
FOLIOָ䲿⣘ׅ4אך؟٦ؽأ ػحءـ 麊欽 ،ؙذ؍ـ 麊欽 剑⡚䫎项겘 ⡚ 剑⡚䫎项겘 넝
Slide 5
Slide 5 text
5 -証券基盤部の技術スタック -Cats Effectの世界に移⾏した3つの理由 -新プロジェクトでCats Effect, FS2, doobieを導⼊した話 今⽇話すこと
Slide 6
Slide 6 text
証券基盤部の技術スタック 6
Slide 7
Slide 7 text
7 証券基盤部の技術スタック - 100% Scala - マイクロサービス - (最近まで)全てFinagleで開発
Slide 8
Slide 8 text
従来の主な使⽤ライブラリ 8 Finagle -Twitter社が作ったRPCシステム Finatra -Finagle上にアプリケーションを構築するためのフレームワーク -HTTP, Thriftサーバーが簡単に書ける -guiceベースのランタイムDI -DIだけ使ったバッチも書ける (com.twitter.inject.App) Quill -DSLからコンパイル時にクエリを⽣成してくれるDBアクセスライブラリ -finagle-mysql上で動かすことができる (JDBCやCassandra版などもある)
Slide 9
Slide 9 text
Cats / Cats Effect -ScalaにFunctor,Monadなどを持ち込むためのライブラリ -Cats EffectはCatsのMonadErrorから⽣やしたIOを提供するライブラリ FS2 -Cats系のStreaming I/Oライブラリ doobie - Cats系のJDBC Wrapper - ⽂字列補間⼦でSQLをそのまま書くタイプ 現在の主な使⽤ライブラリ 9
Slide 10
Slide 10 text
Cats Effectの世界に移⾏した 3つの理由 10
Slide 11
Slide 11 text
11 Quillの代わりにdoobieを使いたかった 理由①
Slide 12
Slide 12 text
DSLで書くのがつらかった 12 - 証券システムでは、帳票出⼒などで複雑なSQLを実⾏する必要がある - 実⾏したい複雑なSQLを⽣成させるDSLを書くのが難しく、時間を溶かす ⼈が多かった
Slide 13
Slide 13 text
QuillのシンプルなDSLならワークするが… 13 Compile
Slide 14
Slide 14 text
複雑なSQLはDSLで更に難読化する 14 ※このDSLはまだ簡単な⽅です
Slide 15
Slide 15 text
quill-finagle-mysqlの問題 15 BATCH INSERTに対応していないため、⼤量データの書き込みに時 間がかかる(JDBC版なら問題なし) quill-finagle-mysql: wrong batch insert action behaviour #747 - getquill / quill
Slide 16
Slide 16 text
doobieの選定理由 16 - SQLがそのまま書ける - ⾃分が前職で使っていたので結構詳しかった - 証券基盤部は強いScalaエンジニアが多く、Catsに詳しい メンバーも何⼈かいるので⼊れても問題ないと判断した - 我々のシステムはほとんどバッチなので、Non-blocking I/OではなくJDBCで⼗分だった
Slide 17
Slide 17 text
17 doobieの簡単なサンプル
Slide 18
Slide 18 text
18 doobieの簡単なサンプル
Slide 19
Slide 19 text
19 doobieの簡単なサンプル
Slide 20
Slide 20 text
20 バッチをストリーム化したかった 理由②
Slide 21
Slide 21 text
⼀般的なFOLIOのバッチ 21 - 計算量が少ないバッチは全件取得して計算しても問題なし Step 1 Step 2 Step 3 Step 4 処理対象 データ取得 処理済み データ除外 計算 計算結果 永続化 DB 全件書込 全件取得 DB STEP① STEP② STEP③ STEP④
Slide 22
Slide 22 text
計算量の多いバッチでやりたいこと - 計算量が多いバッチはチャンク毎に処理させたい - Functionalに書けるソリューションとしてストリームを採⽤したくなった ※quillでも書けるけど前述の理由でquillはやめたかった Step 1 Step 2 Step 3 Step 4 処理対象 データ取得 処理済み データ除外 計算 計算結果 永続化 DB N件書込 N件取得 DB STEP① STEP② STEP③ STEP④ 全件完了するまでN件の処理をループ
Slide 23
Slide 23 text
ストリーム処理ライブラリ 23 doobieがFS2をネイティブサポートしているため、 DBから分割取得するストリームが簡単に作れる!
Slide 24
Slide 24 text
doobieはFS2をネイティブサポート 24 Query0#streamでDBから⼀度にN件fetchして、 メモリに蓄えて1件ずつ下流に流すFS2のfs2.Streamが得られる - streamはstreamWithChunkSize(512)のエイリアス - JDBCのResultSetから⼀度に何件取得するか
Slide 25
Slide 25 text
FS2 vs Akka Streams 25 FS2 - Pullベースなので拡張しやすい - 処理効率的にはPushベースのストリームに劣る(monix-reactiveのドキュメントによると) - Cats Effectに依存している Akka Streams - Reactive streams - Pushベース (バックプレッシャー) - AkkaのActorフレームワークに依存している
Slide 26
Slide 26 text
26 理由③ この話はまた別の機会に RPCを使わなくなったため、 Finagleを使い続ける理由があまり無かった
Slide 27
Slide 27 text
新プロジェクトで Cats Effect, FS2, doobie を導⼊した話 27
Slide 28
Slide 28 text
28 新プロジェクト - 開発メンバー: 10⼈以上 - 開発期間: 9ヶ⽉ - FOLIOのロボアド基盤を刷新する巨⼤プロジェクト 複雑なドメインと戦いながらロボアド基盤をリプレースするときにした⼯夫 - Inside Fintech Meetup
Slide 29
Slide 29 text
29 ⽴ち上げメンバーでどう書くか相談した - RPCが減ったのでFinagle依存を減らしてCatsエコシステムに移⾏するこ とで同意が取れた - Effect WrapperはCats EffectのIOに決定 ⇨ 公式ドキュメントが充実してるから ⇨ 他のWrapperを採⽤したとしてもCats EffectのType Classの理解は必要
Slide 30
Slide 30 text
30 課題 - ラーニングカーブをどう抑えるか - どうやってメンバーにライブラリを布教するか - 強いエンジニアが多いとはいえ、全員がCatsやFS2に詳しいわけではない - 皆で同じように書けるコーディングスタイルを決めたい
Slide 31
Slide 31 text
31 ラーニングカーブを抑えるためにルールを決めた - Tagless-Finalは使わない - DI・バッチの基底クラス等はFinatraを継続して使う ⇨いずれ変えるけど今じゃなくて良いという判断 ⇨リソース開放がイベントハンドラー⽅式なのでcatsのResourceと相性が悪い
Slide 32
Slide 32 text
32 どうチームに布教したか 勝⼿に浸透していったのであまり努⼒してない…
Slide 33
Slide 33 text
33 Aさん「⼟⽇でCats完全理解した」 Bさん「FS2の完全理解doc書いたよ」 みんな強かった
Slide 34
Slide 34 text
布教のためにやったこと(強いて⾔えば…) 34 - ⽴ち上げメンバーで開発の⼟台と最初の⾒本となるバッチを作った - 詳しい⼈に質問したり「ペアプロしませんか」を⾔える雰囲気を⼤事に した
Slide 35
Slide 35 text
35 FS2でのバッチの書き⽅を決めた 各ステップをStreamまたはPipeを返すクラスに分割
Slide 36
Slide 36 text
36 FS2でのバッチの書き⽅を決めた 各ステップをthroughで連結してバッチを構築
Slide 37
Slide 37 text
37 移⾏してよかったか よかった! - エコシステムを⼀気に変えたので最初は開発スピードが落ちたが、課題 はしっかり解決されたし、徐々にスピードも取り戻せた。 - 今後も使い続けたい・全てのサービスをCats Effect, FS2, doobieで置き 換えたいというフィードバックがあり嬉しい
Slide 38
Slide 38 text
新プロジェクトは 今年7⽉14⽇に無事リリース 38
Slide 39
Slide 39 text
39 FOLIOはCats Effect, Doobie, FS2で動いてます
Slide 40
Slide 40 text
(おまけ) doobieからRob Norrisさん(作者)が 離れてしまった話 40
Slide 41
Slide 41 text
まだdoobieの利⽤者は多いと思っている 41 Scalar 2020 whiteboard voting
Slide 42
Slide 42 text
現状はわりと楽観的 42 - 今のところ不満なく使えている - ScalaやCatsのアップデートに追従できなくなったら同じようなコンセプ トの別ライブラリに移⾏しようねという話をしてる
Slide 43
Slide 43 text
作者はSkunkの開発をしている 43 今からPostgreSQLで使うなら Skunkのほうが良さそう https://github.com/tpolecat/skunk
Slide 44
Slide 44 text
Scalaエンジニア募集中! 44
Slide 45
Slide 45 text
※開発⾔語はScalaですが、⼊ってから覚えた⼈もたくさん居ます! お気軽に採⽤ページからカジュアル⾯談のお申し込みを! https://corp.folio-sec.com/thespecialone/jobs/
Slide 46
Slide 46 text
THANK YOU