1FOLIOでCats Effect, FS2, doobieを使って証券システム作ってみた2020/09/25 Scala.tokyo@rider_yiCopyright © 2020 FOLIO Co., Ltd. All Rights Reserved.
View Slide
ABOUT ME2⽯川裕樹 (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で開発
従来の主な使⽤ライブラリ8Finagle-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
11Quillの代わりにdoobieを使いたかった理由①
DSLで書くのがつらかった12- 証券システムでは、帳票出⼒などで複雑なSQLを実⾏する必要がある- 実⾏したい複雑なSQLを⽣成させるDSLを書くのが難しく、時間を溶かす⼈が多かった
QuillのシンプルなDSLならワークするが…13Compile
複雑なSQLはDSLで更に難読化する14※このDSLはまだ簡単な⽅です
quill-finagle-mysqlの問題15BATCH INSERTに対応していないため、⼤量データの書き込みに時間がかかる(JDBC版なら問題なし)quill-finagle-mysql: wrong batch insert action behaviour #747 - getquill / quill
doobieの選定理由16- SQLがそのまま書ける- ⾃分が前職で使っていたので結構詳しかった- 証券基盤部は強いScalaエンジニアが多く、Catsに詳しいメンバーも何⼈かいるので⼊れても問題ないと判断した- 我々のシステムはほとんどバッチなので、Non-blockingI/OではなくJDBCで⼗分だった
17doobieの簡単なサンプル
18doobieの簡単なサンプル
19doobieの簡単なサンプル
20バッチをストリーム化したかった理由②
⼀般的なFOLIOのバッチ21- 計算量が少ないバッチは全件取得して計算しても問題なしStep 1 Step 2 Step 3 Step 4処理対象データ取得処理済みデータ除外計算計算結果永続化DB全件書込全件取得DBSTEP① STEP② STEP③ STEP④
計算量の多いバッチでやりたいこと- 計算量が多いバッチはチャンク毎に処理させたい- Functionalに書けるソリューションとしてストリームを採⽤したくなった ※quillでも書けるけど前述の理由でquillはやめたかったStep 1 Step 2 Step 3 Step 4処理対象データ取得処理済みデータ除外計算計算結果永続化DBN件書込N件取得DBSTEP① STEP② STEP③ STEP④全件完了するまでN件の処理をループ
ストリーム処理ライブラリ23doobieがFS2をネイティブサポートしているため、DBから分割取得するストリームが簡単に作れる!
doobieはFS2をネイティブサポート24Query0#streamでDBから⼀度にN件fetchして、メモリに蓄えて1件ずつ下流に流すFS2のfs2.Streamが得られる- streamはstreamWithChunkSize(512)のエイリアス- JDBCのResultSetから⼀度に何件取得するか
FS2 vs Akka Streams25FS2- 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どうチームに布教したか勝⼿に浸透していったのであまり努⼒してない…
33Aさん「⼟⽇でCats完全理解した」Bさん「FS2の完全理解doc書いたよ」みんな強かった
布教のためにやったこと(強いて⾔えば…)34- ⽴ち上げメンバーで開発の⼟台と最初の⾒本となるバッチを作った- 詳しい⼈に質問したり「ペアプロしませんか」を⾔える雰囲気を⼤事にした
35FS2でのバッチの書き⽅を決めた各ステップをStreamまたはPipeを返すクラスに分割
36FS2でのバッチの書き⽅を決めた各ステップをthroughで連結してバッチを構築
37移⾏してよかったかよかった!- エコシステムを⼀気に変えたので最初は開発スピードが落ちたが、課題はしっかり解決されたし、徐々にスピードも取り戻せた。- 今後も使い続けたい・全てのサービスをCats Effect, FS2, doobieで置き換えたいというフィードバックがあり嬉しい
新プロジェクトは今年7⽉14⽇に無事リリース38
39FOLIOはCats Effect, Doobie, FS2で動いてます
(おまけ)doobieからRob Norrisさん(作者)が 離れてしまった話40
まだdoobieの利⽤者は多いと思っている41Scalar 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