コネクションドレイニング
ロードバランサーがインスタンスを切り離す際に、処理中のリクエストを完了させてから切断する仕組み
ネットワーク可用性
コネクションドレイニングとは
コネクションドレイニング (Connection Draining) は、ロードバランサーがバックエンドインスタンスをターゲットグループから切り離す際に、処理中のリクエストが完了するまで待機してから切断する仕組みである。ALB では「登録解除の遅延 (Deregistration Delay)」と呼ばれる。
ドレイニングなしでインスタンスを即座に切り離すと、処理中のリクエストが中断され、ユーザーに 502 Bad Gateway が返る。
動作の流れ
1. インスタンス A をターゲットグループから登録解除
2. ALB は新しいリクエストをインスタンス B, C に振り分け
3. インスタンス A の処理中リクエストは完了まで待機
4. 全リクエスト完了 or タイムアウト → インスタンス A を切断
タイムライン:
t=0 登録解除開始
t=0〜 新規リクエスト → B, C に振り分け
t=0〜 処理中リクエスト → A で完了まで待機
t=30 全リクエスト完了 → A を切断
t=300 タイムアウト (未完了でも強制切断)
| 設定値 | 適するケース |
|---|---|
| 0 秒 | 即座に切断 (処理中リクエストは中断) |
| 30 秒 | API サーバー (レスポンスが速い) |
| 120 秒 | ファイルアップロード、長時間処理 |
| 300 秒 | デフォルト (多くの場合は長すぎる) |
デフォルトの 300 秒は多くの場合長すぎる。API サーバーなら 30〜60 秒で十分だ。長すぎるとデプロイ時間が延びる。
ゼロダウンタイムデプロイとの関係
ローリングアップデートやブルーグリーンデプロイでは、旧インスタンスの切り離し時にコネクションドレイニングが動作する。
ローリングアップデート:
1. 新インスタンス v2 を起動
2. v2 がヘルスチェックに合格
3. 旧インスタンス v1 を登録解除 → ドレイニング開始
4. v1 の処理中リクエストが完了
5. v1 を停止
ECS + Fargate での注意点
ECS タスクの停止時、ALB のドレイニングと ECS の stopTimeout の両方が関係する。
- ALB の Deregistration Delay: ALB がタスクへの新規リクエストを停止し、処理中リクエストの完了を待つ
- ECS の stopTimeout: SIGTERM 送信後、SIGKILL までの猶予時間
stopTimeout は Deregistration Delay 以上に設定する。そうしないと、ドレイニング中にタスクが強制終了される。
Graceful Shutdown との連携
アプリケーション側でも SIGTERM を受け取ったら、新規リクエストの受付を停止し、処理中のリクエストを完了してから終了する。
process.on('SIGTERM', () => {
server.close(() => {
console.log('All connections closed');
process.exit(0);
});
});
体系的に学ぶなら関連書籍を参照してほしい。