🧑💻
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