How we made a financial system using Cats Effect, FS2, and doobie in FOLIO

E4b90a83a8579205f3b18c9855062526?s=47 Yuki Ishikawa
September 25, 2020

How we made a financial system using Cats Effect, FS2, and doobie in FOLIO

E4b90a83a8579205f3b18c9855062526?s=128

Yuki Ishikawa

September 25, 2020
Tweet

Transcript

  1. 1 FOLIOでCats Effect, FS2, doobieを使って 証券システム作ってみた 2020/09/25 Scala.tokyo @rider_yi Copyright

    © 2020 FOLIO Co., Ltd. All Rights Reserved.
  2. ABOUT ME 2 ⽯川裕樹 (Yuki Ishikawa) @rider_yi - 2019年1⽉⼊社 -

    株とか全然詳しくなかったけど、フィンテックに興味が あり⼊社。FOLIOに⼊ってから投資を始めた - 証券基盤部で証券システムの裏側を作ってる - Scala歴6年くらい
  3. FOLIO?

  4. FOLIOָ䲿⣘ׅ׷4אך؟٦ؽأ ػحءـ 麊欽 ،ؙذ؍ـ 麊欽 剑⡚䫎项겘 ⡚ 剑⡚䫎项겘 넝

  5. 5 -証券基盤部の技術スタック -Cats Effectの世界に移⾏した3つの理由 -新プロジェクトでCats Effect, FS2, doobieを導⼊した話 今⽇話すこと

  6. 証券基盤部の技術スタック 6

  7. 7 証券基盤部の技術スタック - 100% Scala - マイクロサービス - (最近まで)全てFinagleで開発

  8. 従来の主な使⽤ライブラリ 8 Finagle -Twitter社が作ったRPCシステム Finatra -Finagle上にアプリケーションを構築するためのフレームワーク -HTTP, Thriftサーバーが簡単に書ける -guiceベースのランタイムDI -DIだけ使ったバッチも書ける

    (com.twitter.inject.App) Quill -DSLからコンパイル時にクエリを⽣成してくれるDBアクセスライブラリ -finagle-mysql上で動かすことができる (JDBCやCassandra版などもある)
  9. Cats / Cats Effect -ScalaにFunctor,Monadなどを持ち込むためのライブラリ -Cats EffectはCatsのMonadErrorから⽣やしたIOを提供するライブラリ FS2 -Cats系のStreaming I/Oライブラリ

    doobie - Cats系のJDBC Wrapper - ⽂字列補間⼦でSQLをそのまま書くタイプ 現在の主な使⽤ライブラリ 9
  10. Cats Effectの世界に移⾏した 3つの理由 10

  11. 11 Quillの代わりにdoobieを使いたかった 理由①

  12. DSLで書くのがつらかった 12 - 証券システムでは、帳票出⼒などで複雑なSQLを実⾏する必要がある - 実⾏したい複雑なSQLを⽣成させるDSLを書くのが難しく、時間を溶かす ⼈が多かった

  13. QuillのシンプルなDSLならワークするが… 13 Compile

  14. 複雑なSQLはDSLで更に難読化する 14 ※このDSLはまだ簡単な⽅です

  15. quill-finagle-mysqlの問題 15 BATCH INSERTに対応していないため、⼤量データの書き込みに時 間がかかる(JDBC版なら問題なし) quill-finagle-mysql: wrong batch insert action

    behaviour #747 - getquill / quill
  16. doobieの選定理由 16 - SQLがそのまま書ける - ⾃分が前職で使っていたので結構詳しかった - 証券基盤部は強いScalaエンジニアが多く、Catsに詳しい メンバーも何⼈かいるので⼊れても問題ないと判断した -

    我々のシステムはほとんどバッチなので、Non-blocking I/OではなくJDBCで⼗分だった
  17. 17 doobieの簡単なサンプル

  18. 18 doobieの簡単なサンプル

  19. 19 doobieの簡単なサンプル

  20. 20 バッチをストリーム化したかった 理由②

  21. ⼀般的なFOLIOのバッチ 21 - 計算量が少ないバッチは全件取得して計算しても問題なし Step 1 Step 2 Step 3

    Step 4 処理対象 データ取得 処理済み データ除外 計算 計算結果 永続化 DB 全件書込 全件取得 DB STEP① STEP② STEP③ STEP④
  22. 計算量の多いバッチでやりたいこと - 計算量が多いバッチはチャンク毎に処理させたい - Functionalに書けるソリューションとしてストリームを採⽤したくなった  ※quillでも書けるけど前述の理由でquillはやめたかった Step 1 Step 2

    Step 3 Step 4 処理対象 データ取得 処理済み データ除外 計算 計算結果 永続化 DB N件書込 N件取得 DB STEP① STEP② STEP③ STEP④ 全件完了するまでN件の処理をループ
  23. ストリーム処理ライブラリ 23 doobieがFS2をネイティブサポートしているため、 DBから分割取得するストリームが簡単に作れる!

  24. doobieはFS2をネイティブサポート 24 Query0#streamでDBから⼀度にN件fetchして、 メモリに蓄えて1件ずつ下流に流すFS2のfs2.Streamが得られる - streamはstreamWithChunkSize(512)のエイリアス - JDBCのResultSetから⼀度に何件取得するか

  25. FS2 vs Akka Streams 25 FS2 - Pullベースなので拡張しやすい - 処理効率的にはPushベースのストリームに劣る(monix-reactiveのドキュメントによると)

    - Cats Effectに依存している Akka Streams - Reactive streams - Pushベース (バックプレッシャー) - AkkaのActorフレームワークに依存している
  26. 26 理由③ この話はまた別の機会に RPCを使わなくなったため、 Finagleを使い続ける理由があまり無かった

  27. 新プロジェクトで Cats Effect, FS2, doobie を導⼊した話 27

  28. 28 新プロジェクト - 開発メンバー: 10⼈以上 - 開発期間: 9ヶ⽉ - FOLIOのロボアド基盤を刷新する巨⼤プロジェクト

    複雑なドメインと戦いながらロボアド基盤をリプレースするときにした⼯夫 - Inside Fintech Meetup
  29. 29 ⽴ち上げメンバーでどう書くか相談した - RPCが減ったのでFinagle依存を減らしてCatsエコシステムに移⾏するこ とで同意が取れた - Effect WrapperはCats EffectのIOに決定   ⇨

    公式ドキュメントが充実してるから   ⇨ 他のWrapperを採⽤したとしてもCats EffectのType Classの理解は必要
  30. 30 課題 - ラーニングカーブをどう抑えるか - どうやってメンバーにライブラリを布教するか - 強いエンジニアが多いとはいえ、全員がCatsやFS2に詳しいわけではない - 皆で同じように書けるコーディングスタイルを決めたい

  31. 31 ラーニングカーブを抑えるためにルールを決めた - Tagless-Finalは使わない - DI・バッチの基底クラス等はFinatraを継続して使う  ⇨いずれ変えるけど今じゃなくて良いという判断   ⇨リソース開放がイベントハンドラー⽅式なのでcatsのResourceと相性が悪い

  32. 32 どうチームに布教したか 勝⼿に浸透していったのであまり努⼒してない…

  33. 33 Aさん「⼟⽇でCats完全理解した」 Bさん「FS2の完全理解doc書いたよ」 みんな強かった

  34. 布教のためにやったこと(強いて⾔えば…) 34 - ⽴ち上げメンバーで開発の⼟台と最初の⾒本となるバッチを作った - 詳しい⼈に質問したり「ペアプロしませんか」を⾔える雰囲気を⼤事に した

  35. 35 FS2でのバッチの書き⽅を決めた 各ステップをStreamまたはPipeを返すクラスに分割

  36. 36 FS2でのバッチの書き⽅を決めた 各ステップをthroughで連結してバッチを構築

  37. 37 移⾏してよかったか よかった! - エコシステムを⼀気に変えたので最初は開発スピードが落ちたが、課題 はしっかり解決されたし、徐々にスピードも取り戻せた。 - 今後も使い続けたい・全てのサービスをCats Effect, FS2,

    doobieで置き 換えたいというフィードバックがあり嬉しい
  38. 新プロジェクトは 今年7⽉14⽇に無事リリース 38

  39. 39 FOLIOはCats Effect, Doobie, FS2で動いてます

  40. (おまけ) doobieからRob Norrisさん(作者)が
 離れてしまった話 40

  41. まだdoobieの利⽤者は多いと思っている 41 Scalar 2020 whiteboard voting

  42. 現状はわりと楽観的 42 - 今のところ不満なく使えている - ScalaやCatsのアップデートに追従できなくなったら同じようなコンセプ トの別ライブラリに移⾏しようねという話をしてる

  43. 作者はSkunkの開発をしている 43 今からPostgreSQLで使うなら Skunkのほうが良さそう https://github.com/tpolecat/skunk

  44. Scalaエンジニア募集中! 44

  45. ※開発⾔語はScalaですが、⼊ってから覚えた⼈もたくさん居ます! お気軽に採⽤ページからカジュアル⾯談のお申し込みを! https://corp.folio-sec.com/thespecialone/jobs/

  46. THANK YOU