讓你的 Go 服務優雅的重啟 (解決程式碼釋出 Go 服務閃斷的問題)

CryptoPanda發表於2020-11-30

封面

有同學反饋 釋出 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

  1. overseer新增了Fetcher,當Fetcher返回有效的二進位流(io.Reader) 時,主程式會將它儲存到臨時位置並驗證它,替換當前的二進位制檔案並啟動。
    Fetcher執行在一個goroutine中,預先會配置好檢查的間隔時間。Fetcher支援File、GitHub、HTTP和S3的方式。詳細可檢視包package fetcher

  2. overseer新增了一個主程式管理平滑重啟。子程式處理連線,能夠保持主程式pid不變。

筆者才疏學淺,倉促成文, 如有不當之處,還請大家斧正.

關注微信公眾號『程式碼與遠方』,後臺回覆“1024”檢視更多內容,回覆“微信”新增我微信。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章