При временной ошибке (сеть, 5xx) повторять запрос с задержкой. Exponential backoff: задержка растет (1s, 2s, 4s, ...) до лимита. В Go: цикл с проверкой контекста и ошибки (retryable или нет), time.Sleep(backoff), ограничение числа попыток. Библиотеки: cenkalti/backoff, hashicorp/go-retryablehttp. Не ретраить идемпотентность-критичные операции без идемпотентного ключа или только безопасные методы (GET).
for i := 0; i < maxRetries; i++ {
resp, err := client.Do(req)
if err == nil && resp.StatusCode < 500 { return resp, nil }
select {
case <-ctx.Done(): return nil, ctx.Err()
case <-time.After(time.Duration(1<