Провайдер SMS завис, и число горутин сервиса выросло до сотен тысяч
func sendSMS(phone, text string) error {
resp, err := http.Post(smsURL, "application/json", body(phone, text))
if err != nil {
return err
}
defer resp.Body.Close()
return nil
}
Провайдер перестал отвечать, не разрывая соединения. Через час в сервисе сотни тысяч горутин, память на пределе. Что не так?
- У стандартного клиента нет таймаута, запросы ждут вечно
- defer закрывает тело ответа слишком поздно
- http.Post нельзя вызывать из нескольких горутин
- Провайдер SMS должен сам разрывать соединение
