グレースフルシャットダウン
OSシグナルの処理と接続の排出
「グレースフルシャットダウン」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
グレースフルシャットダウンの理由
os.Exit を呼び出したり、単にサーバーを停止したりすると、処理中のすべてのリクエストが破棄されます。グレースフルシャットダウンでは、終了前にアクティブなリクエストの完了を待機します。
http.Server.Shutdown
srv.Shutdown(ctx) は新しい接続の受付を停止し、アクティブなリクエストの完了を待ってから戻ります。待機時間に上限を設けるには、期限付きのコンテキストを渡します。
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
srv.Shutdown(ctx)シグナル処理
goroutine で SIGINT/SIGTERM を待機し、受信したら Shutdown を呼び出します。
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("shutting down...")
srv.Shutdown(ctx)完全なグレースフルシャットダウンパターン
サーバーを goroutine で起動し、シグナルチャネルでブロックして待機し、その後シャットダウンします。
go func() {
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
log.Fatal(err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
srv.Shutdown(ctx)http.ErrServerClosed
Shutdown が呼び出されると、ListenAndServe は http.ErrServerClosed を返します。これはエラーではなく、正常な終了として扱います。
接続のドレイン
Shutdown は、ハイジャックされた接続とアクティブな WebSocket 接続について、ハンドラー自身がコンテキストのキャンセルを尊重する場合にのみ、それらすべての完了を待機します。ロングポーリングやストリーミングを行うハンドラーでは、r.Context().Done() を確認する必要があります。
シャットダウンのタイムアウト
適切なシャットダウンタイムアウト(10~30 秒)を設定します。期限を過ぎてもリクエストが実行中の場合、Shutdown は context.DeadlineExceeded を返し、残りの接続は強制的に閉じられます。
シャットダウン時のクリーンアップ
Shutdown が戻った後、データベースプールを閉じ、ログバッファーをフラッシュし、その他のリソースを順番に解放します。defer または明示的な順序付けを使用します。
srv.Shutdown(ctx)
db.Close()
logger.Sync()Server.Close と Server.Shutdown
srv.Close() は待機せずにすべての接続を直ちに閉じます。強制停止が許容される場合(テストなど)にのみ使用します。
Kubernetes の readiness probe
シャットダウン中は、Shutdown を呼び出す前に readiness probe が 503 を返すように更新します。これにより、ロードバランサーに対して、その pod への新しいリクエストのルーティングを停止するよう通知できます。
複数のサーバー
複数のサーバー(HTTP、gRPC、メトリクスなど)を実行している場合は、goroutine でそれぞれを同時にシャットダウンし、WaitGroup ですべての接続がドレインされるのを待機します。
確認問題
http.Server.Shutdown は何を行いますか。
まとめ:グレースフルシャットダウン
重要なポイント:
- srv.Shutdown(ctx) は新しい接続を停止し、アクティブな接続の完了を待機します
- signal.Notify で SIGINT/SIGTERM を待機します
- シャットダウン時、ListenAndServe は http.ErrServerClosed を返します。これはエラーではありません
- いつまでも待機し続けないよう、シャットダウンの期限を設定します
よくある質問
「グレースフルシャットダウン」レッスンは無料ですか?
はい。「グレースフルシャットダウン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「グレースフルシャットダウン」で何を学びますか?
OSシグナルの処理と接続の排出 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「グレースフルシャットダウン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- HTTPサーバーの作成
- ルーティングとパスパラメーター
- ミドルウェアパターン
- グレースフルシャットダウン