概要
先日リリースされた1.11でソケットオプションを設定できるようになりました。
これによってLinux 3.9から導入されたSO_REUSEPORT
という、同じポートでbindすることが可能になる機能が利用可能になります。
環境
何が嬉しい?
一言で言うとGraceful Restartが可能になるという点です。
通常サーバプロセスを再起動するとその瞬間はリクエストを捌けなくなります。
Rolling updateのような事ができる環境であればいいですが、そうではない場合
- a) Listenしているsocketのfile descriptorの複製
- b)
SO_REUSEPORT
を使う
といった手段でデプロイ時に一時的に古いプロセスを残したまま新しいプロセスを起動し、起動完了後に古いプロセスを落とすといった形で実現する必要があります。
ただし a
, b
のような手段でないと bind error で新しいプロセスの方は起動できません。通常使用中のポートは別プロセスで利用できないからです。
今回リリースされたgolang 1.11では b
を自前でサクッと対応できるようになります。