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