Вопрос: Как сделать `context`-aware запрос к внешнему сервису с ретраями?
Go
Senior
Без компании
Вопрос: Как сделать `context`-aware запрос к внешнему сервису с ретраями?
Ответы
```go
for i := 0; i < 3; i++ {
if ctx.Err() != nil { return ctx.Err() }
req, _ := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
resp, err := client.Do(req)
if err == nil && resp.StatusCode/100 == 2 {
resp.Body.Close()
return nil
}
if resp != nil { resp.Body.Close() }
time.Sleep(time.Duration(i+1) * 200 * time.Millisecond)
}
return fmt.Errorf("failed")
```
**Как это работает:** проверка `ctx.Err()` позволяет прекратить ретраи при отмене/таймауте.