Upgrade to Pro — share decks privately, control downloads, hide ads and more …

FinTechの現場でバリバリ活躍するFastAPIの理想と現実 (PyCon APAC 2023)

Sho Nakamura
October 28, 2023

FinTechの現場でバリバリ活躍するFastAPIの理想と現実 (PyCon APAC 2023)

FastAPIの人気が日に日に増している昨今ですが、まだまだ「他のフレームワークでいいじゃん」「本当に本番投入して大丈夫?」など様々な思いで導入をためらっている方も多いかと思います。
理想的な姿はあれど、現実的には理想を追い過ぎると準備やメンテナンスのコストが高すぎうまくいかないこともあります。そのため、ある程度の妥協をして開発・運用していくことになりますが、”コスパ”のいい塩梅をお届けします。

私は、日頃FinTechというミッションクリティカルなドメインにおいてFastAPIをかれこれ2年以上運用しており、その現場からの開発の現実を紹介します。これならFastAPIを実務で使えそうだな、という実感を抱いて帰っていただきたいと思っています。
同じ思いで、「動かして学ぶ!Python FastAPI開発入門」という本を今年出版しました。本では体系的に学べるようにするため盛り込めなかったTipsもいくつかあり、このセッションでも少し触れていく予定です。

Sho Nakamura

October 28, 2023
Tweet

More Decks by Sho Nakamura

Other Decks in Programming

Transcript

  1. お前誰よ? • @sh0nk (github) ◦ @sh0nk0 (X): スライドもこちらに • Love

    Beer 🍻 • FinTechスタートアップsustenの取締役 ◦ 「おまかせ資産運用」をつくっています • 前職ではML/NLPを使った検索エンジン・推薦システム (recommendation engine)の開発 • Python歴:10+年 • PyCon参加歴:2014、2016年(7年ぶり、初登壇) 2 @sh0nk0
  2. どんなFramework? • 他のFrameworkとの違い ◦ Django REST Framework ▪ 大規模WebフレームワークであるDjangoでAPIを開発できるようにしたライブラリ ▪

    FastAPIも自動でAPIドキュメントを生成する点でヒントを得ている ▪ Djangoの上に成り立っている(依存している)ため重量級 ◦ Flask ▪ かなりシンプルなフレームワーク( Microframework) ▪ シンプルがゆえドキュメントが技術的過ぎたり、複雑なことをやろうとすると他のライブラリの力を借りるこ とになる 7 @sh0nk0
  3. どんなFramework? • 他のFrameworkとの違い ◦ Django REST Framework ▪ 大規模WebフレームワークであるDjangoでAPIを開発できるようにしたライブラリ ▪

    FastAPIも自動でAPIドキュメントを生成する点でヒントを得ている ▪ Djangoの上に成り立っている(依存している)ため重量級 ◦ Flask ▪ かなりシンプルなフレームワーク( Microframework) ▪ シンプルがゆえドキュメントが技術的過ぎたり、複雑なことをやろうとすると他のライブラリの力を借りるこ とになる 誤解を恐れずに言うと... 「Django REST Frameworkぐらい色んなこと (例えばバリデーションやAPIドキュメントの自動生成) をFlaskぐらい軽量に扱える」 “Battery included”な いいとこ取り WebAPIフレームワーク 🔋 8 @sh0nk0
  4. どんなFramework? • 使われているシーン ◦ NetflixやUberなどのBig Techも導入 ▪ 例 • Netflix

    Dispatch: システム障害管理ツール (https://github.com/Netflix/dispatch) ◦ OSSなどでも活用されている ▪ Chroma: LLMなどで使われるEmbeddingsを保存するベクトルDB 9 @sh0nk0
  5. FastAPIはどう動いているか? Dockerコンテナ Pydantic バリデーション シリアライズ Starlette 低レイヤ Webフレームワーク Uvicorn ASGI

    Server SQLAlchemy Peewee など O/Rマッパー データ ベース 10 • FastAPIは2つの強力なライブラリPydantic/Starletteの上に成り立っている @sh0nk0
  6. そもそも金融でPython大丈夫なの? • 私たちがPython/FastAPIを採用した理由 ◦ Python ▪ 機械学習との親和性 • 社内の資産運用・投資判断チームが利用 •

    資産運用でのPython(データ分析、クオンツ運用)は今回のトークの対象外 ◦ FastAPI ▪ 型安全 • 金融、特に数値計算において型は重要(後述) ▪ いくつかのエビデンスによると「速いらしい」 ▪ 実際に触ってみて、「 Swagger UI自動生成すごいし、フレームワークとして伸びそうな予感が する」 25 @sh0nk0
  7. まずはアーキテクチャ Webアプリ スマート フォン アプリ 金融機関接続 勘定システム KYC/AML システム 外部

    接続 バッチを含む 内製システム ユーザーとの インターフェイス KYC=Know Your Customer AML=Anti-Money Laundering 口座開設時の審査を行う 入出金・口座引落にて、銀行等の金 融機関との接続を行う 日々の顧客ごとの口座管理(投資信 託の買付・売却等)を行う 外部 接続 外部 接続 WebAPI (FastAPI アプリ) 26 @sh0nk0
  8. まずはアーキテクチャ Webアプリ スマート フォン アプリ 金融機関接続 勘定システム KYC/AML システム 外部

    接続 バッチを含む 内製システム ユーザーとの インターフェイス KYC=Know Your Customer AML=Anti-Money Laundering 口座開設時の審査を行う 入出金・口座引落にて、銀行等の金 融機関との接続を行う 日々の顧客ごとの口座管理(投資信 託の買付・売却等)を行う 外部 接続 外部 接続 WebAPI (FastAPI アプリ) 27 金融ドメインのAPIは 「ミッションクリティカル」なAPIになりがち @sh0nk0
  9. 型ヒント • どれぐらい厳密に型ヒントを用いるか? ◦ すべての変数に定義することもできる ◦ しかし、 ▪ 静的型付け言語ほど型に関する IDEのサポートが完全とも言い難い

    ▪ コードを書くスピードと、全体のコードの可読性も重要 ◦ → 変数定義・代入など比較的自明な部分には、基本的には型ヒントは不要とする ▪ 明示的にしたい、型が複雑な箇所では適宜付加可能 現実 変数定義には 型ヒントを 無理に付けない 29 @sh0nk0
  10. 型ヒント • どれぐらい厳密に型ヒントを用いるか? ◦ すべての変数に定義することもできる ◦ しかし、 ▪ 静的型付け言語ほど型に関する IDEのサポートが完全とも言い難い

    ▪ コードを書くスピードと、全体のコードの可読性も重要 ◦ → 変数定義・代入など比較的自明な部分には、基本的には型ヒントは不要とする ▪ 明示的にしたい、型が複雑な箇所では適宜付加可能 現実 変数定義には 型ヒントを 無理に付けない 30 「静的型付け言語の型チェックと同等のチェックを目指す」 までは目指さない 基本的には 「関数の引数及び返り値には必ず型ヒントを」 ぐらいの緩めのルールで運用 @sh0nk0
  11. Tips:数値計算 • 金融の計算では小数点が登場することがしばしば ◦ 小数点(float)は丸め誤差が発生する • Decimalの利用 ◦ 勘定系システムではDecimalを使う ◦

    MySQLなどはdecimal型をサポートしているので、そのままdecimalとして保存 ◦ Decimalを利用する際は、インスタンス作成時にも一度もfloatを介さないように注意 ▪ 直接小数点の数値を与える場合はstrとして与える 34 @sh0nk0
  12. Swagger UI • ビジネスメンバーが使うツールとしても活用 ◦ 以下のような操作が、非エンジニアでも簡単に(意外と)扱える ▪ セレクトボックスによるパラメータの指定 ▪ ファイルのダウンロード

    ▪ パラメータやエンドポイントに 自由に説明が加えられる 現実 37 「こいつ…動くぞ!」 (非エンジニアでも動かせる) 自動生成されるAPIドキュメント(Swagger UI)により、 FastAPIは「業務を支えるツール」にもなり得る @sh0nk0
  13. 非同期化 • asyncioを使った書き方ができていないコードでも十分本番環境で パフォーマンスを出している ◦ FastAPIはasyncioを使わずとも、”よしなに” threading処理をやってくれる ◦ asyncioを使う場合はIOバウンドな処理(DBや他のAPIへのアクセス)を伴うシーンだけで十分 •

    代替策 ◦ SUSTENではAmazon ECSを使っているが、アクセス増への対策としてはコンテナの Auto Scaling による富豪的なリソース確保で十分対応できている ECS Task #1 ECS Task #2 ECS Task #3 ・・・ 現実 40 @sh0nk0
  14. 非同期化 • asyncioを使った書き方ができていないコードでも十分本番環境で パフォーマンスを出している ◦ FastAPIはasyncioを使わずとも、”よしなに” threading処理をやってくれる ◦ asyncioを使う場合はIOバウンドな処理(DBや他のAPIへのアクセス)を伴うシーンだけで十分 •

    代替策 ◦ SUSTENではAmazon ECSを使っているが、アクセス増への対策としてはコンテナの Auto Scalingによる富豪的なリソース確保で十分対応できている ECS Task #1 ECS Task #2 ECS Task #3 ・・・ 現実 41 これからFastAPIを導入する場合は 今後のメンテコストと照らし、asyncioを使うのか検討 使う場合は無理に全体で対応せず、バランスを見るのがGood 「非同期化はFastAPI導入のハードルにはならない」 FastAPI公式docより引用 @sh0nk0
  15. まとめ • イマドキの金融システムは ”普通の” Web技術の結晶でできている ◦ レガシーじゃないよ! 電子決済系、仮想通貨系以外でも FinTech屋はいます •

    FastAPIを駆使すれば、様々な業務の効率化ができる ◦ 例えばSwagger UIでの業務支援 • Pythonでも、型ヒントとFastAPIのバリデーション、静的解析ツールなどを有効活用 し適切なテストを書けば、「ミッションクリティカル」な世界でも十分戦える • 型ヒントにしろ非同期化にしろ、「完璧を求めすぎない」がFastAPIとうまく付き合うコ ツ 44 @sh0nk0