fix(iot): ретрай GetQueueUrl на старте + выход ≠0 при сбое подсистемы (🔴5)
- Добавлен ResolveQueueURLWithRetry (10 попыток × 2с backoff): временная ошибка GetQueueUrl больше не роняет bridge/consumer без ретрая. - main.go: при ПОСТОЯННОЙ ошибке bridge/consumer процесс завершается с кодом ≠ 0 (fatal-флаг + cancel), чтобы платформа перезапустила контейнер — раньше процесс оставался жив, а /health отдавал 200.
This commit is contained in:
@@ -16,6 +16,7 @@ import (
|
||||
"os"
|
||||
"os/signal"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
@@ -102,12 +103,20 @@ func main() {
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(2)
|
||||
|
||||
// fatal — подсистема (bridge/consumer) завершилась с ПОСТОЯННОЙ ошибкой.
|
||||
// Тогда после штатной остановки выходим с кодом ≠ 0, чтобы платформа
|
||||
// перезапустила контейнер (ревью 🔴5: раньше процесс оставался жив, а
|
||||
// /health отдавал 200).
|
||||
var fatal atomic.Bool
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
ready.SetBridge(true)
|
||||
defer ready.SetBridge(false)
|
||||
if err := bridge.Run(ctx, cfg, sqsClient, log); err != nil && !errors.Is(err, context.Canceled) {
|
||||
log.Error("bridge stopped", "err", err)
|
||||
fatal.Store(true)
|
||||
cancel() // штатный shutdown, затем выход ≠ 0
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -117,6 +126,8 @@ func main() {
|
||||
defer ready.SetConsumer(false)
|
||||
if err := consumer.Run(ctx, cfg, sqsClient, iotStore, log); err != nil && !errors.Is(err, context.Canceled) {
|
||||
log.Error("consumer stopped", "err", err)
|
||||
fatal.Store(true)
|
||||
cancel()
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -139,5 +150,9 @@ func main() {
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
if fatal.Load() {
|
||||
log.Error("iot-service: подсистема завершилась с ошибкой — выход ≠ 0")
|
||||
os.Exit(1)
|
||||
}
|
||||
log.Info("iot-service stopped")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user