← ノート一覧に戻る

TMDb API と Supabase を ISR でつなぐときの落とし穴

revalidate の設計を間違えると、無料枠はあっという間に溶ける。外部APIとDBの間にキャッシュを挟むときに考えたこと。

  • Next.js
  • Supabase
  • ISR

外部 API のデータを DB に持ち、それをページに出す。よくある構成ですが、キャッシュの層が2つ以上あると「どこで古くなっているのか」が急に分からなくなります。

何が起きたか

ページを開くたびに Supabase へクエリが飛んでいて、無料枠のリクエスト数が想定より早く増えていました。原因は単純で、動的なパラメータを使うページで再検証の間隔を設定していなかったことです。

考え方を整理する

データの性質ごとに、許容できる古さは違います。

  • ほぼ変わらないもの(作品のタイトル・公開年)→ 長め
  • たまに変わるもの(配信サービスの取り扱い)→ 中くらい
  • すぐ反映したいもの(ユーザーが登録した内容)→ キャッシュしない

この分類をページ単位ではなくデータ単位でやると、再検証の間隔を決める根拠がはっきりします。ページ単位で考えると「このページには両方載っているから短いほうに寄せよう」となり、結果的に全体が短くなりがちです。

画像を自分の帯域に通さない

もうひとつ効いたのが画像です。外部 CDN にある画像を自分のサーバー経由で最適化すると、その分だけ自分の帯域と最適化クレジットを消費します。元の CDN を直接参照するようにしただけで、消費が目に見えて落ちました。

学び

キャッシュは「速くするため」だけの仕組みではなく、無料枠を守るための設計でもある。個人開発では後者の意味のほうが先に効いてきます。