Heroku リクエストタイムアウトはアプリケーション側にも忘れずに

(本記事はしくじり案件です)

Heroku Router は、dynoとの接続確立後30秒の間に何かしらレスポンスを受け取らなかった場合、リクエストを強制終了してしまう。そのため、Herokuアプリケーション側では30秒以内に処理を完了させておく必要がある。

処理自体を30秒以内に完了させるよう実装することは非常に重要なことではあるが、もう1つ大事なポイントがドキュメントに記載されている。

それはアプリケーション側でも、30秒(もしくはそれ以下)のタイムアウト処理を実装する必要がある、ということだ。

Request Timeout | Heroku Dev Center
Learn about the behavior of the Heroku routers, connection termination and connection timeouts.
接続が強制終了されると、クライアントに対してエラーページが発行されます。リクエストを処理していた Web dyno はそのまま放置され、応答を送信できなくてもリクエストの処理を続行します。
その後、後続のリクエストは同じプロセスに送られることがありますが、そのプロセスは (アプリケーションの言語またはフレームワークの並列性動作によっては) 応答できないため、さらなる悪化を引き起こします。

アプリケーション側でタイムアウト機能を実装(もしくは設定など)していないと、Heroku Routerはリクエストを強制終了しているのに、アプリケーション側は処理を継続していて無駄なリソース消費が発生してしまう。
しかも、Heroku Routerからさらに次のリクエストが投げられても処理できずに、さらなるパフォーマス悪化を引き起こす可能性がある、ということだ。

アプリケーション側でも、タイムアウトの設定は忘れずに。