Загружаем изображение…
🧑‍💻 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
Просмотры: 261
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти