有同學反饋 釋出 Go 服務程式碼 監控報警會出現一堆 5xx 報警
檢視生產環境的專案部署指令碼 發現目前的部署指令碼會
supervisorctl restart monkey_interact_service
暴力重啟 supervisor 託管的守護程式
會導致 go 的 server 先 stop 停止web服務, 再 start 提供新的 web 服務,
導致上線過程中的請求失敗 監控報警群裡一噸報警
給 Go 程式傳送 SIGUSR2 訊號 優雅重啟 過程中不會中斷 web 服務
go web服務可以採用 gracehttp oversee 等成熟的技術方案
github.com/facebookarchive/grace
github.com/jpillora/overseer
未使用優雅重啟前supervisorctl restart monkey_interact_service
用 wrk 壓測 開12 個執行緒 每秒鐘 4000 個請求 請求 20s
有 209456 個成功請求
有 163580 個錯誤請求
使用優雅重啟後supervisorctl signal SIGUSR2 monkey_interact_service
同樣的 使用 wrk 壓測 開12 個執行緒 每秒鐘 4000 個請求 請求 20s
223552 個成功請求
0個錯誤請求
supervisord >= 3.2.0
由於 supervisord 3.2.0 才增加對 signal 訊號的支援
詳見 supervisord.org/changes.html#id20
overseer新增了Fetcher,當Fetcher返回有效的二進位流(io.Reader) 時,主程式會將它儲存到臨時位置並驗證它,替換當前的二進位制檔案並啟動。
Fetcher執行在一個goroutine中,預先會配置好檢查的間隔時間。Fetcher支援File、GitHub、HTTP和S3的方式。詳細可檢視包package fetcheroverseer新增了一個主程式管理平滑重啟。子程式處理連線,能夠保持主程式pid不變。
筆者才疏學淺,倉促成文, 如有不當之處,還請大家斧正.
關注微信公眾號『程式碼與遠方』,後臺回覆“1024”檢視更多內容,回覆“微信”新增我微信。
本作品採用《CC 協議》,轉載必須註明作者和本文連結