ひとことで言うと
タイムアウトは、応答を待つ時間に上限をつけて、それを超えたら処理を諦めて先へ進む仕組みです。
サーバーへのリクエスト、データベースへの問い合わせ、外部APIの呼び出しなど、相手から返事が来ない場面でよく設定されます。 待ち続けると他の処理も詰まってしまうため、タイムアウトは「諦める勇気」をシステムに持たせる安全装置です。
たとえ話でもう少し詳しく
タイムアウトは、電話の自動切断設定に近いです。
- 電話をかけて相手が出なければ、いつまでも待ち続けるわけにはいかない
- 一定回数コールしても反応がなければ自動で切る
- 切ったあとに「つながりませんでした」と次の行動を考えられる
システムでも同じです。 あるサーバーへリクエストを送っても返事がなかった場合、永遠に待ち続けると接続が溜まり、別のユーザーへの応答まで遅れ始めます。 タイムアウトを設定しておくと、一定時間で待ちをやめてエラーとして扱い、処理を進められます。
よく出る場面・使いどころ
- 外部APIやサービスへのリクエストが応答しないとき
- データベースへの問い合わせが想定より長くかかるとき
- ネットワーク越しのファイル取得が途中で止まったとき
- ユーザー操作への応答が一定時間ない場合にセッションを切るとき
似た言葉との違い
- レイテンシ
- 応答が返ってくるまでの遅れ時間そのもの
- タイムアウトは、その遅れが許容範囲を超えたら処理を打ち切るための上限設定
- ヘルスチェック
- サーバーが正常かどうかを定期確認する仕組み
- タイムアウトはヘルスチェックの応答待ちにも設定される
- エラー
- 処理が失敗したという結果
- タイムアウトはエラーの一種で、「時間内に返事が来なかった」という失敗
実務で気にするポイント
- 接続タイムアウト(つながるまでの上限)と読み取りタイムアウト(データが返るまでの上限)を分けて設定する
- 上限を短くしすぎると正常な処理まで失敗になる
- タイムアウト後にリトライするか、エラーとして返すかを決めておく
- タイムアウトが多発しているときは、相手の処理遅延やネットワーク問題のサインとして調査する
注意: タイムアウトを設定していないと、応答しない相手を待ち続けて接続が枯渇する「スレッド枯渇」につながることがあります。外部との通信には必ずタイムアウトを入れておくことが基本です。