🐍

FastAPI採用 〜バックエンド構成の検討と決断〜

2024/12/21に公開

はじめに

こんにちは!株式会社ブロードエッジ・ウェアリンク CTOの高丸です。
今回は、Qiita Advent Calendar 2024の6日目の記事です。

今回は、バックエンドにFastAPIを導入したお話を共有します。

LaravelからFastAPIへ

弊社はもともと、ECサイトをShopifyで運営し、独自の診断システム「wine@KARTE(カルテ)」をPHP/Laravelで動かしていました。Shopifyとは連携こそしますが、別システムということです。
Laravelは、私が参画したときの業務委託のメンバーよりさらに前にご協力いただいていたフリーランスの方の技術選定で、引き継いで利用していました。

今回、5日目の記事でも書いた通り、ECサイトのフロントエンドをヘッドレス化するに伴い、APIベースのバックエンドを作る必要になりました。

いずれはLaravelで書かれたロジックも新APIに吸収する形を検討しつつ、バックエンドの技術を選定しました。

そこで私は、Python/FastAPIを選定しました。

メンバーのスキルセットを考慮

技術選定の記事は、ZennやQiitaでもなかなかホットな話題ですが、正解はないと思います。

私が、まず検討したのはチームメンバーのスキルセットでした。
最近のバックエンドといえば、GoやTypeScriptなどの静的型付け言語が選ばれる傾向にあり、パフォーマンスも型安全も期待できるので魅力的。
ですが、当時はAWS Lambdaや管理ツールでもPythonを使っていたため、慣れ親しんでいるのはPythonでした。

正直、APIならどんな言語やフレームワークでもいいと私は思います。
大事なのは、パフォーマンスに気を遣いながら開発することかなと。

FastAPIは、API用途の軽めのフレームワークなので、
最初は爆速で、ロジックを追加していくうちにパフォーマンスが低下していくだろう。
そのパフォーマンスを気にしながら、開発していく予定でした。

ただし、FastAPIの高パフォーマンスをキープしていくには、FastAPIに備えられている機能を十分に使う必要があります。

FastAPIに関して

FastAPIは、StackOverflow Surveyが示す通り、DjangoやFlaskに次ぐ人気となっています。

  • Pydanticとの統合により、データの型チェックと検証
  • async/await構文を使用した非同期処理をサポート
  • 依存性注入システム

というのが特徴ですが、私が特に注目しているのは、Pydanticです。

最近のPythonはPydanticの恩恵を受けることで、静的型付け言語に近い使い勝手を得ることができています。GoやTypeScriptを選ばなくても良いきっかけとなりました。

フロントエンドがTypeScriptのHydrogen(Remix)なので、型を付けることはレスポンスのデータ構造をちゃんと意識することにつながりますし、後日の記事で書きますが、GraphQLのスキーマ定義には必須事項となってきます。

私はもともとRubyistだったので、動的言語にこそ愛着はありますが、Pydanticを使ってみて「これはいい」と思いました。特にFastAPIがネイティブで統合してくれているので、簡単なインストールで型安全のPythonを実現できます。
(Rubyに型を求めるのはちょっと違うと思いますが)

ハイパフォーマンスの裏に潜む落とし穴

FastAPIの公式ページのTOPには、実は「Node.JSやGoに匹敵する」というパフォーマンスの表記があります。

ここで注意しなければいけないのは、SQL Alchemyです。
SQL Alchemyは、Pythonの中では最も強力なORMですが、ドキュメントがいかんせんやさしくなく、投げられているSQLをちゃんと意識しないでコーディングすると、すぐに余計なSQLを発行していていたりします。(ORMではよくあることですが)

弊社も、リプレイスプロジェクトの進捗遅れや、捌かなければいけないタスク量の多さから、パフォーマンスに対する意識が少なくなっていってしまったため、リリース時にSQL Alchemy周りのパフォーマンス劣化で切り戻しをする結果になりました。(後日の記事で詳細を書きます)

この技術選定はアリだったのか?

5日目のフロントエンドに続き、この見出しで締めようと思います。

メンバーの学習コストと、エコシステムを考えると、FastAPIは良かったと思います。

正直、速いコンパイル言語だと、パフォーマンス面は気になりにくかったのかなとも思いますが、
Goなどもシンプルな文法の反面、書き方がとっ散らかると、結局は負債になってしまうので、
品質(特にパフォーマンス面)を最初からこだわることが大事だなという印象を受けました。

FastAPIの弊社での利用に関して、詳しい記事は後日の記事で書きたいと思います。

Discussion