Retry с exponential backoff - стратегия повторных попыток, при которой задержка растет (часто удваивается): 1s, 2s, 4s, обычно с верхним пределом и случайным джиттером.
func retryWithBackoff(ctx context.Context, maxAttempts int, fn func() error) error {
backoff := time.Second
for i := 0; i < maxAttempts; i++ {
if err := fn(); err == nil { return nil }
select {
case <-ctx.Done(): return ctx.Err()
case <-time.After(backoff): backoff *= 2
if backoff > 30*time.Second { backoff = 30 * time.Second }
}
}
return errors.New("max attempts exceeded")
}