🧑💻 Go может автоматически перезапускать упавшие задачи с экспоненциальной задержкой
🧑💻 Go может автоматически перезапускать упавшие задачи с экспоненциальной задержкой 👁 В автоматизации внешние сервисы, SSH-команды и API периодически становятся недоступны. Вместо бесконечного цикла с фиксированным time.Sleep можно реализовать ограниченные повторные попытки с экспоненциальной задержкой и случайным разбросом — это снижает нагрузку на восстанавливающуюся систему и предотвращает одновременные повторные запросы от множества воркеров. 📝 Реализуем повторные попытки с экспоненциальной задержкой: package main import ( "context" "fmt" "math/rand" "time" ) func retry(ctx context.Context, attempts int, task func() error) error { delay := 500 * time.Millisecond maxDelay := 15 * time.Second for i := 0; i < attempts; i++ { if err := task(); err == nil { return nil } else if i == attempts-1 { return fmt.Errorf("task failed after %d attempts: %w", attempts, err) } jitter := time.Duration(rand.Int63n(int64(delay/2 + 1))) timer := time.NewTimer(delay + jitter) select { case <-ctx.Done(): timer.Stop() return ctx.Err() case <-timer.C: } delay *= 2 if delay > maxDelay { delay = maxDelay } } return nil } func main() { ctx, cancel := context.WithTimeout( context.Background(), 60*time.Second, ) defer cancel() err := retry(ctx, 6, func() error { fmt.Println("Пробуем подключиться...") return fmt.Errorf("service unavailable") }) if err != nil { fmt.Println("Ошибка:", err) } } 📌 Как это работает: • Экспоненциальная задержка увеличивает интервал между попытками, а верхний предел не позволяет ему расти бесконечно. • jitter добавляет случайность, уменьшая вероятность одновременного повторного обращения множества клиентов. • context.Context позволяет прекратить ожидание при отмене задачи или истечении общего таймаута. ❗️ Такой механизм полезен для CI/CD-агентов, фоновых обработчиков, API-клиентов и автоматизации инфраструктуры. Важно повторять только временные ошибки: например, сетевые сбои и HTTP 503, но не ошибки авторизации или некорректные параметры. Для операций с побочными эффектами также необходимо учитывать идемпотентность. tags: #go #автоматизация #разработка 🧭 @recura_tech