$30 off During Our Annual Pro Sale. View Details »

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

Yuki Ishikawa
September 25, 2020

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

Yuki Ishikawa

September 25, 2020
Tweet

More Decks by Yuki Ishikawa

Other Decks in Programming

Transcript

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

    View Slide

  2. ABOUT ME
    2
    ⽯川裕樹 (Yuki Ishikawa) @rider_yi
    - 2019年1⽉⼊社
    - 株とか全然詳しくなかったけど、フィンテックに興味が
    あり⼊社。FOLIOに⼊ってから投資を始めた
    - 証券基盤部で証券システムの裏側を作ってる
    - Scala歴6年くらい

    View Slide

  3. FOLIO?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. 従来の主な使⽤ライブラリ
    8
    Finagle
    -Twitter社が作ったRPCシステム
    Finatra
    -Finagle上にアプリケーションを構築するためのフレームワーク
    -HTTP, Thriftサーバーが簡単に書ける
    -guiceベースのランタイムDI
    -DIだけ使ったバッチも書ける (com.twitter.inject.App)
    Quill
    -DSLからコンパイル時にクエリを⽣成してくれるDBアクセスライブラリ
    -finagle-mysql上で動かすことができる (JDBCやCassandra版などもある)

    View Slide

  9. Cats / Cats Effect
    -ScalaにFunctor,Monadなどを持ち込むためのライブラリ
    -Cats EffectはCatsのMonadErrorから⽣やしたIOを提供するライブラリ
    FS2
    -Cats系のStreaming I/Oライブラリ
    doobie
    - Cats系のJDBC Wrapper
    - ⽂字列補間⼦でSQLをそのまま書くタイプ
    現在の主な使⽤ライブラリ
    9

    View Slide

  10. Cats Effectの世界に移⾏した
    3つの理由
    10

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. doobieの選定理由
    16
    - SQLがそのまま書ける
    - ⾃分が前職で使っていたので結構詳しかった
    - 証券基盤部は強いScalaエンジニアが多く、Catsに詳しい
    メンバーも何⼈かいるので⼊れても問題ないと判断した
    - 我々のシステムはほとんどバッチなので、Non-blocking
    I/OではなくJDBCで⼗分だった

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. ⼀般的なFOLIOのバッチ
    21
    - 計算量が少ないバッチは全件取得して計算しても問題なし
    Step 1 Step 2 Step 3 Step 4
    処理対象
    データ取得
    処理済み
    データ除外
    計算
    計算結果
    永続化
    DB
    全件書込
    全件取得
    DB
    STEP① STEP② STEP③ STEP④

    View Slide

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

    View Slide

  23. ストリーム処理ライブラリ
    23
    doobieがFS2をネイティブサポートしているため、
    DBから分割取得するストリームが簡単に作れる!

    View Slide

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

    View Slide

  25. FS2 vs Akka Streams
    25
    FS2
    - Pullベースなので拡張しやすい
    - 処理効率的にはPushベースのストリームに劣る(monix-reactiveのドキュメントによると)
    - Cats Effectに依存している
    Akka Streams
    - Reactive streams
    - Pushベース (バックプレッシャー)
    - AkkaのActorフレームワークに依存している

    View Slide

  26. 26
    理由③
    この話はまた別の機会に
    RPCを使わなくなったため、
    Finagleを使い続ける理由があまり無かった

    View Slide

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

    View Slide

  28. 28
    新プロジェクト
    - 開発メンバー: 10⼈以上
    - 開発期間: 9ヶ⽉
    - FOLIOのロボアド基盤を刷新する巨⼤プロジェクト
    複雑なドメインと戦いながらロボアド基盤をリプレースするときにした⼯夫 - Inside Fintech Meetup

    View Slide

  29. 29
    ⽴ち上げメンバーでどう書くか相談した
    - RPCが減ったのでFinagle依存を減らしてCatsエコシステムに移⾏するこ
    とで同意が取れた
    - Effect WrapperはCats EffectのIOに決定
      ⇨ 公式ドキュメントが充実してるから
      ⇨ 他のWrapperを採⽤したとしてもCats EffectのType Classの理解は必要

    View Slide

  30. 30
    課題
    - ラーニングカーブをどう抑えるか
    - どうやってメンバーにライブラリを布教するか
    - 強いエンジニアが多いとはいえ、全員がCatsやFS2に詳しいわけではない
    - 皆で同じように書けるコーディングスタイルを決めたい

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  38. 新プロジェクトは
    今年7⽉14⽇に無事リリース
    38

    View Slide

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

    View Slide

  40. (おまけ)
    doobieからRob Norrisさん(作者)が

    離れてしまった話
    40

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  46. THANK YOU

    View Slide