0Pricing
Go Academy · レッスン

グレースフルシャットダウン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. HTTPサーバーの作成
  2. ルーティングとパスパラメーター
  3. ミドルウェアパターン
  4. グレースフルシャットダウン
← Go Academyに戻る