Перейти к содержанию
Версия: 4.2.159 Обновлено: 2026-04-29

Практики goroutine

Goroutines в Saga должны завершаться управляемо и не скрывать ошибки.

Правила

  • Использовать context.Context для долгих операций.
  • Вызывать defer cancel() после создания timeout context.
  • Логировать ошибки внутри goroutine.
  • Не запускать бесконечные loops без shutdown signal.
  • Закрывать channels только со стороны отправителя или coordinator.

WaitGroup pattern

var wg sync.WaitGroup
for _, item := range items {
    wg.Add(1)
    go func(item Item) {
        defer wg.Done()
        if err := process(ctx, item); err != nil {
            logger.Error("process failed", "error", err)
        }
    }(item)
}
wg.Wait()

Запрещено

  • go func(){ for { ... } }() без context.
  • Игнорировать error внутри goroutine.
  • Писать в unbuffered channel без гарантированного reader.
  • Создавать goroutine в request path без owner lifecycle.

Ссылки