緣起:線上的go service 掛了,無法啟動。
原因:采用的第三方庫有個bug, 在go攜程里面執行task的時候會產生out of range 的panic, 而我又把任務隊列每次加載的時候重做一次,導致無法啟動。
分析:go攜程里面某個task執行失敗,不應該影響service的正常運行。
解決:在go協程插入recover, 出現panic的時候,自己退出而不影響整個service
func server(workChan <-chan *Work) { for work := range workChan { go safelyDo(work) } } func safelyDo(work *Work) { defer func() { if err := recover(); err != nil { log.Stderr("work failed:", err) debug.PrintStack() } }() do(work) }
參考:
http://www.yiibai.com/go/go_error_handle.html