IoT: maxReceiveCount ко всем ошибкам consumer, ждать Shutdown до deferred Close, не 500 после успешного create

This commit is contained in:
Repinoid
2026-10-11 08:48:29 +03:00
parent 93d47376b1
commit 4c1b9b7b9e
3 changed files with 30 additions and 2 deletions
+16
View File
@@ -136,6 +136,22 @@ func Run(ctx context.Context, cfg *config.Config, sqsClient *sqs.Client, store *
continue
}
log.Error("consumer: process telemetry", "err", err, "message_id", aws.ToString(msg.MessageId))
// Ошибка обработки (не envelope, напр. PG). Применяем тот же лимит
// повторов, что и для битых envelope — иначе постоянная ошибка крутила
// бы сообщение бесконечно (visibility timeout → повтор → снова ошибка).
recv := receiveCount(msg)
if recv >= maxReceiveCount {
log.Error("consumer: dropped after maxReceiveCount",
"message_id", aws.ToString(msg.MessageId), "receive_count", recv, "err", err)
if dlqURL != "" {
if derr := sendToDLQ(ctx, sqsClient, dlqURL, body, log); derr == nil {
pending = append(pending, pendingAck{aws.ToString(msg.ReceiptHandle), aws.ToString(msg.MessageId)})
}
} else {
pending = append(pending, pendingAck{aws.ToString(msg.ReceiptHandle), aws.ToString(msg.MessageId)})
}
continue
}
// Сообщение НЕ подтверждаем — вернётся после visibility timeout.
// Backoff с jitter — не долбить упавший PG в цикле
// (фикс HIGH из ревью 2026-08-16: лавина ретраев).