feat(consumer): битые envelope → DLQ вместо потери

processTelemetry теперь возвращает sentinel errInvalidEnvelope при битом JSON
(раньше — молчаливый nil → mусор подтверждался и терялся). Consumer при этой
ошибке кладёт тело в DLQ (SQS_DLQ_NAME, дефолт iot-telemetry-dlq) и подтверждает
основное сообщение; без DLQ — только логирует, но НЕ подтверждает (оседает).
Добавлены SQSDLQName в config + DefaultSQSDLQName. Реальные ошибки PG (не invalid)
по-прежнему не подтверждаются и уходят в ретрай после visibility timeout.
This commit is contained in:
Repinoid
2026-10-07 07:40:09 +03:00
parent 2b3838680f
commit 4031882cae
4 changed files with 48 additions and 4 deletions
+2
View File
@@ -26,6 +26,7 @@ type Config struct {
SQSAccessKey string
SQSSecretKey string
SQSQueueName string
SQSDLQName string
SQSRegion string
// SQS-потребитель
@@ -109,6 +110,7 @@ func Load() (*Config, error) {
SQSAccessKey: os.Getenv("SQS_ACCESS_KEY"),
SQSSecretKey: os.Getenv("SQS_SECRET_KEY"),
SQSQueueName: getEnv("SQS_QUEUE_NAME", DefaultSQSQueueName),
SQSDLQName: getEnv("SQS_DLQ_NAME", DefaultSQSDLQName),
SQSRegion: getEnv("SQS_REGION", DefaultSQSRegion),
SQSLongPollSeconds: getEnvInt("SQS_LONG_POLL_SECONDS", 20),
SQSVisibilityTimeout: getEnvInt("SQS_VISIBILITY_TIMEOUT", 120),
+5
View File
@@ -13,6 +13,11 @@ const (
// DefaultSQSQueueName — очередь телеметрии IoT.
DefaultSQSQueueName = "iot-telemetry"
// DefaultSQSDLQName — DLQ для «мёртвых» сообщений: битые envelope, которые
// нельзя разобрать (повторная обработка бессмысленна). Валидные данные
// идут в основную очередь; неразборчивые — сюда, а не отбрасываются.
DefaultSQSDLQName = "iot-telemetry-dlq"
// DefaultSQSRegion — регион для self-hosted SQS (не важен, оставлен для SDK).
DefaultSQSRegion = "us-east-1"