Практики 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.