Goで実現するgraceful shutdown: 実運用での課題と解決策

Room 1 13:15 - 13:20

#### 目的 Go アプリケーションにおける、HTTP サーバ、バックグラウンド処理を安全に終了させたい開発者に向けて、graceful shutdown の実践的な Tips を共有します。 #### 詳細 このセッションでは、以下の項目に絞って説明します 1. **graceful shutdown の基本概念** - `os.Signal`を使ったシグナルハンドリングの仕組み - `context`パッケージを活用したタイムアウト管理 2. **HTTP サーバーでの graceful shutdown** - `net/http`の`Shutdown`メソッドで実現している安全なシャットダウン方法をおさらい - リクエスト処理中の接続を安全に切断する方法 3. **goroutine の管理とリソース解放** - `sync.WaitGroup`を使った並行処理の安全な終了 - シャットダウン時のリソース解放の注意点 4. **実運用での応用例** - **課題:** - メール送信プロセスなど、バックグラウンドで実行されるタスクが残っているにも関わらず、サーバがシャットダウンしてしまう問題があった。 - シャットダウン時に新規プロセスの受け入れを適切に停止しつつ、既存プロセスの完了を待つ仕組みが必要になった。 - **解決策:** - 先人の導入例を参考に、安全にプロセスを終了させるための具体的な実装方法を紹介します。 #### Appendix - [graceful shutdown可能な非同期リトライするGoライブラリをOSSとして作った話](https://qiita.com/behiron/items/b224a68e8c3d8b9de89d) - [Go MachineryでGraceful shutdownできてないバグを直した話](https://tech.layerx.co.jp/entry/2022/12/13/201832)