FastAPI採用 〜バックエンド構成の検討と決断〜
はじめに
こんにちは!株式会社ブロードエッジ・ウェアリンク 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