このサイトを視聴するにはJavaScriptを有効にしてください。Full-stack)JS/PHP/Go/Docker/Nginxなど。技術または趣味よりの発信ブログです。このブログ自体も自分がnetlify/gatsbyJS/Reactで書いてます。一部の記事はgithubアカウントでコメントできます。Shutdownを独自実装する現在、キュー処理のコードを書いていて、これは後からでも使えるなと思ったので記事作成。通常、処理が走っている状態のままプロセスを再起動や停止を掛けてしまうと、処理途中でプロセスが無くなってしまうため、その後の処理もそのまま消えてしまいます。処理の中でファイルをAPIでアップロードした後にデータベースにファイルメタデータを書き込む、みたいな処理にて、APIアップロードの後にデータベース書き込みが終わっていない場合に、シャットダウンするとデータベースの書き込みが無くなってしまいます。shutdownというものが存在します。Shutdownはhttpサーバに関してはGolangで標準実装されています。httpサーバの場合はリクエスト処理を全て処理したのち、リクエストが0になったということを確認して停止することが出来ます。log.Print(err)}このServer.Shutdownという関数はGo1.8にて追加され、より安全に停止することが可能になりました。今回は非同期キュー処理のコードだったので、httpサーバではないため使えません。Shutdownのような機構を独自実装します。この非同期キューはPub-Sub型のキューです。実装しているときはstomp(ActiveMQ)でしたが、ここでは語りません。簡易な実装と置き換えています。仕組みはこんな感じです。キュー処理の購読を開始する。メッセージが飛んで来たら処理を行う。実行している処理はsync.WaitGroupで管理するsignal.Notifyを使って停止シグナル(SIGTERMなど)を待つCtrl+Cを押すことでSIGTERMを受信するキュー処理の購読を削除するsync.WaitGroupを使用して残処理を管理し、全ての処理が終わるまで待つ0になれば残処理が無くなったと判断し、プロセスを終了する。endWaiter.Wait()}"mq"というパッケージはないのでこのコードはそのまま動きませんが、実行するとこんな感じになるはず。End!Exitちゃんと処理が停止してから終了しています。キャッチ可能なシグナルctrl+cを押したときはSIGINT、killコマンドなど一般的な終了はSIGTERM、ハングアップがSIGHUP、強制終了がSIGKILL。SIGKILLに関しては強制終了なだけあって、キャッチできずに強制的に消されるようです。package.他にもいろいろありますが、一般的なのを抑えておけば大丈夫かな?Dockerコンテナでの再起動の場合ちなみにDockerコンテナでもちゃんと動作します。送信して停止することです。