我有一个包含两个goroutines的处理程序。处理程序由前端每10秒执行一次。一旦调用,goroutines就会向外部API发送GET http请求。出于某种原因,有时(不经常)我在任何goroutine中随机获得以下错误(似乎外部API拒绝请求)。
的StatusCode:408
恐慌:读取tcp 192.168.1.106:62598->80.243.175.58:443:wsarecv:远程主机强行关闭现有连接。够程 8280 [正在运行]: 监测/监控-V2-goAPI / services.GetNodeCpuLimits.func2(0x815ba0, 0xc04231a1c0,0x0,0x0,0x0,0x0,0xc042158240,0x14,0x0,0x0,...)
当发生这种情况时,会触发恐慌(错误)并终止我的应用程序。由于我以异步方式重建处理程序以提高速度(在请求只是同步之前),因此发生此错误。
我想知道我是否做错了什么。如果没有,我该如何处理?我无法承担终止申请。
代码
func TestFunc(w http.ResponseWriter, r *http.Request) {
c := make(chan NgxJSON)
wg := &sync.WaitGroup{}
var queryParams QueryParams
_ = json.NewDecoder(r.Body).Decode(&queryParams)
fmt.Println("- queryParams ->", queryParams)
wg.Add(1)
go func(queryParams QueryParams, c chan NgxJSON, wg *sync.WaitGroup) {
defer wg.Done()
req, err := http.NewRequest("GET", APIURL1+queryParams.Param1, nil)
if err != nil {
fmt.Println(err)
return
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err) //<-- Error triggers here!!
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
var response Response
json.Unmarshal([]byte(string(body)), &response)
//DO THINGS
c <- ngxJSON
}(queryParams, c, wg)
wg.Add(1)
go func(queryParams QueryParams, c chan NgxJSON, wg *sync.WaitGroup) {
defer wg.Done()
req, err := http.NewRequest("GET", APIURL2+APIURL2+queryParams.Param2, nil)
if err != nil {
fmt.Println(err)
return
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err) //<-- Error triggers here!!
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
var response Response
json.Unmarshal([]byte(string(body)), &response)
//DO THINGS
c <- ngxJSON
}
}(queryParams, c, wg)
go func() {
wg.Wait()
close(c)
}()
//DO THINGS
}
答案 0 :(得分:4)
我无法承担终止申请。
然后不要惊慌,但要处理408,例如通过重试或返回上游错误。