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:
@@ -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),
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user