筆者はNext.jsアプリをVercelからCloudflare Workers(OpenNext経由)に移行した際、実機で画面遷移を続けると処理が止まる不具合に遭遇しました。具体例として、在庫一覧から商品一覧に遷移して3分待っても表示されないという事象が起きたそうです。DBプール設定の変更、ドライバの統一、リトライ機能の追加など計4回の対策を試みましたが、いずれも解決しなかったといいます。
真の原因は、DBクライアントのインスタンスをモジュールスコープ(モジュール全体で共有される範囲)で使い回していたことでした。Cloudflare Workersの実行環境workerdでは、TCPソケットがそれを作ったリクエストのI/Oコンテキストに紐付くため、別のリクエストが同じソケットを再利用しようとすると、無限に解決しないPromiseが発生していたとのことです。
最終的にReactのcache()関数を使い、リクエストごとのスコープ内でのみDBクライアントの重複排除を行い、リクエスト間では共有しない実装に変更することで解決したと報告しています。
出典が伝えている要点
- 著者はNext.jsアプリをVercelからCloudflare Workers(OpenNext経由)に移行した
- 移行後、実機で画面を続けて開くと処理が止まる症状が発生した
- 具体例として、在庫一覧から商品一覧に遷移して3分待っても表示されない事象が起きた
- 著者はこの問題に対して4回対策を試みたが直らなかった
- 試みた対策にはDBプール設定の変更が含まれる
- 試みた対策にはドライバの統一が含まれる
- 試みた対策にはリトライ機能の追加が含まれる
- 真の原因はDBクライアントインスタンスをモジュールスコープで使い回していたことだった
- Cloudflare Workersの実行環境workerdでは、TCPソケットはそれを作ったリクエストのI/Oコンテキストに紐付く
- 別のリクエストが同じソケットを再利用しようとすると、無限に解決しないPromiseが発生する
- 最終的な解決策はReactのcache()関数を使い、リクエストごとのスコープ内でのみDBクライアントの重複排除を行い、リクエスト間では共有しないようにしたことである
原文より
実機で画面を続けて開くと止まる
出典: zenn.dev