Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goで実現するGraceful Shutdown ~実運用での課題と解決策~ / Go Co...

Avatar for uhzz uhzz
September 26, 2025
240

Goで実現するGraceful Shutdown ~実運用での課題と解決策~ / Go Conference 2025

Avatar for uhzz

uhzz

September 26, 2025
Tweet

More Decks by uhzz

Transcript

  1. © Finatext Holdings Ltd. • Graceful Shutdown の基本概念 • net/httpパッケージの

    Graceful Shutdown • 実運用の課題 • 実運用の応用例 • まとめ 1 アジェンダ
  2. © Finatext Holdings Ltd. 3 Graceful Shutdown の基本概念 処理中タスクのリソースを適切に開放した後に、アプリケーション自身を終了すること Graceful

    Shutdownなし 処理中 SIGTERM (終了要求) SIGKILL (強制終了) 処理中 処理中タスクを適切に開放 アプリケーションも安全に終了 SIGTERM (終了要求) SIGKILL (強制終了) Graceful Shutdownあり
  3. © Finatext Holdings Ltd. signal.NotifyContext • OSから終了要求(SIGTERM)を受信 →ctx.Done() で検知 context.WithTimeout

    • context にタイムアウト時間を設定 • タイムアウト付き context を Shutdownメソッドに渡す。 →時間内に、シャットダウン処理を 安全に終了させることが目的 4 Graceful Shutdown の基本概念 Graceful Shutdownの具体例
  4. © Finatext Holdings Ltd. 5 net/httpパッケージの Graceful Shutdown HTTP サーバ内部の流れ

    Shutdown メソッドをおさらい • 全37行のコード • やっていること ◦ 全リスナーの受付停止 ◦ コールバック処理 ◦ アイドル接続をクローズ 順を追ってコードを見ていきます https://cs.opensource.google/go/go/+/refs/tags/go1.25.1:src/net/http/server.go;l=3179
  5. © Finatext Holdings Ltd. 6 net/httpパッケージの Graceful Shutdown HTTP サーバ内部の流れ

    https://cs.opensource.google/go/go/+/refs/tags/go1.25.1:src/net/http/server.go;l=3179 Shutdown メソッドをおさらい • 全37行のコード • やっていること ◦ 全リスナーの受付停止 ◦ コールバック処理 ◦ アイドル接続をクローズ
  6. © Finatext Holdings Ltd. 7 net/httpパッケージの Graceful Shutdown HTTP サーバ内部の流れ

    https://cs.opensource.google/go/go/+/refs/tags/go1.25.1:src/net/http/server.go;l=3179 Shutdown メソッドをおさらい • 全37行のコード • やっていること ◦ 全リスナーの受付停止 ◦ コールバック処理 ◦ アイドル接続をクローズ
  7. © Finatext Holdings Ltd. 8 HTTP サーバ内部の流れ net/httpパッケージの Graceful Shutdown

    https://cs.opensource.google/go/go/+/refs/tags/go1.25.1:src/net/http/server.go;l=3179 Shutdown メソッドをおさらい • 全37行のコード • やっていること ◦ 全リスナーの受付停止 ◦ コールバック処理 ◦ アイドル接続をクローズ アイドル接続のクローズが完了 (またはタイムアウト)した時点で シャットダウン処理は終了
  8. © Finatext Holdings Ltd. 9 実運用の課題 課題: メール一括送信リクエスト後に開始した非同期の送信処理が、デプロイに巻き込まれて終了してしまう 原因: 非同期タスクの

    Graceful Shutdown ができていなかった 同じサーバー上で処理 1. デプロイによる アプリケーションの終了 2. 送信中に強制終了
  9. © Finatext Holdings Ltd. 11 実運用の応用例 1. メール送信専用ワーカーを別で起動する 2. GracefulWorker

    で非同期にリクエスト&安全にリクエスト処理を完了できる仕組みにした 別々のサーバー上で処理 1.SIGTERM 2.Graceful Shutdown 3. 送信処理完了
  10. © Finatext Holdings Ltd. graceful shutdown可能な非同期リトライするGoライブラリをOSSとして作った話 https://qiita.com/behiron/items/b224a68e8c3d8b9de89d Cleanup handling in

    Go / Go Conference 2024 https://speakerdeck.com/k1low/go-conference-2024 Go MachineryでGraceful shutdownできてないバグを直した話 https://tech.layerx.co.jp/entry/2022/12/13/201832 14 Appendix