Goで実装しているアプリケーションが起動しているときに外部から終了や割り込みの命令 (signal) を受けるときがあります。
これらの命令を受け即時終了してしまうと、リクエスト処理が強制的に終了され中途半端な状態の処理が発生する恐れがあります。
そのためそれらの命令を受け取った場合は、実行中の処理の終了を待つことなど適切な終了処理を行う必要があります。これを、一般的には Graceful Shutdown といいます。
この課題は Go 言語の仕様や、HTTP Server の挙動を理解していないとクリアできない難しめの難易度になっています。分からないところは、検索して調べたり、それでも分からない場合は質問事項をまとめてメンターと相談してみましょう。
利用する標準パッケージの実装: signal.NotifyContext, http.Server, sync.WaitGroup
標準パッケージのみで実装できますが、難しい場合は下記のライブラリを利用して実装してみよう。
https://github.com/110y/run
見るポイント
- コード可読性
- signal.NotifyContext の signal の引数 (os.Interrupt, os.Kill)
- WaitGroup (もしくは、それに準ずる処理) のハンドリング
- signal の受け取り処理 (signal 受け取り後、timeout の設定、shutdown 呼び出し)
- shutdown, listen and serve それぞれのエラーハンドリング