Slide 1

Slide 1 text

© Finatext Holdings Ltd. Goで実現する Graceful Shutdown ~実運用での課題と解決策 ~ Reo Uehara / 株式会社Finatext 2025/09/27(土) Go Conference 2025

Slide 2

Slide 2 text

© Finatext Holdings Ltd. ● Graceful Shutdown の基本概念 ● net/httpパッケージの Graceful Shutdown ● 実運用の課題 ● 実運用の応用例 ● まとめ 1 アジェンダ

Slide 3

Slide 3 text

© Finatext Holdings Ltd. 2 自己紹介 X:@_uhzz_ GitHub:uh-zz 好きなパッケージ: net/http Reo Uehara / 株式会社Finatext

Slide 4

Slide 4 text

© Finatext Holdings Ltd. 3 Graceful Shutdown の基本概念 処理中タスクのリソースを適切に開放した後に、アプリケーション自身を終了すること Graceful Shutdownなし 処理中 SIGTERM (終了要求) SIGKILL (強制終了) 処理中 処理中タスクを適切に開放 アプリケーションも安全に終了 SIGTERM (終了要求) SIGKILL (強制終了) Graceful Shutdownあり

Slide 5

Slide 5 text

© Finatext Holdings Ltd. signal.NotifyContext ● OSから終了要求(SIGTERM)を受信 →ctx.Done() で検知 context.WithTimeout ● context にタイムアウト時間を設定 ● タイムアウト付き context を Shutdownメソッドに渡す。 →時間内に、シャットダウン処理を 安全に終了させることが目的 4 Graceful Shutdown の基本概念 Graceful Shutdownの具体例

Slide 6

Slide 6 text

© 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

Slide 7

Slide 7 text

© 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行のコード ● やっていること ○ 全リスナーの受付停止 ○ コールバック処理 ○ アイドル接続をクローズ

Slide 8

Slide 8 text

© 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行のコード ● やっていること ○ 全リスナーの受付停止 ○ コールバック処理 ○ アイドル接続をクローズ

Slide 9

Slide 9 text

© 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行のコード ● やっていること ○ 全リスナーの受付停止 ○ コールバック処理 ○ アイドル接続をクローズ アイドル接続のクローズが完了 (またはタイムアウト)した時点で シャットダウン処理は終了

Slide 10

Slide 10 text

© Finatext Holdings Ltd. 9 実運用の課題 課題: メール一括送信リクエスト後に開始した非同期の送信処理が、デプロイに巻き込まれて終了してしまう 原因: 非同期タスクの Graceful Shutdown ができていなかった 同じサーバー上で処理 1. デプロイによる アプリケーションの終了 2. 送信中に強制終了

Slide 11

Slide 11 text

© Finatext Holdings Ltd. GracefulWorker ● 非同期タスクは、GracefulWorker経由で実行 ● 登録した非同期タスクが完了するまでシャットダウンを待機する アプローチ: 非同期タスクマネージャーを実装 10 実運用の応用例

Slide 12

Slide 12 text

© Finatext Holdings Ltd. 11 実運用の応用例 1. メール送信専用ワーカーを別で起動する 2. GracefulWorker で非同期にリクエスト&安全にリクエスト処理を完了できる仕組みにした 別々のサーバー上で処理 1.SIGTERM 2.Graceful Shutdown 3. 送信処理完了

Slide 13

Slide 13 text

© Finatext Holdings Ltd. ● HTTPサーバのシグナルハンドリングはすぐに始められるので導入しておこう ● デプロイ時の強制終了で非同期タスクが巻き込まれないように Graceful Shutdownの仕組みを導入しよう 12 まとめ Happy smart shutdown together!

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

© 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