From 3e1d981614bbd6ecb7a1184ad76848a1f3bbf6f7 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Sun, 11 Oct 2026 07:51:57 +0300 Subject: [PATCH] =?UTF-8?q?fix(iot):=20=D0=BF=D1=83=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B5=20=D1=82=D0=B5=D0=BB=D0=BE=20=D1=81=D0=BE=D0=BE=D0=B1?= =?UTF-8?q?=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=20=E2=86=92=20DLQ=20(=D0=B2?= =?UTF-8?q?=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=D0=BC=D0=BE=D0=BB=D1=87=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=BE=D0=B4=D1=82?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Убран ранний дроп пустого тела; теперь оно идёт через processTelemetry → errInvalidEnvelope → DLQ (или дроп после maxReceiveCount, если DLQ недоступна). --- internal/service/consumer/consumer.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/internal/service/consumer/consumer.go b/internal/service/consumer/consumer.go index fd0f293..6c54538 100644 --- a/internal/service/consumer/consumer.go +++ b/internal/service/consumer/consumer.go @@ -100,12 +100,14 @@ func Run(ctx context.Context, cfg *config.Config, sqsClient *sqs.Client, store * } var pending []pendingAck for _, msg := range resp.Messages { - if msg.Body == nil || *msg.Body == "" { - log.Warn("consumer: empty message body", "message_id", aws.ToString(msg.MessageId)) - pending = append(pending, pendingAck{aws.ToString(msg.ReceiptHandle), aws.ToString(msg.MessageId)}) - continue + // nil/пустое тело не подтверждаем молча: прогоняем через processTelemetry, + // который вернёт errInvalidEnvelope → DLQ (ревью 2026-10-10: пустое тело + // подтверждалось без DLQ). + body := "" + if msg.Body != nil { + body = *msg.Body } - if err := processTelemetry(ctx, *msg.Body, store, log); err != nil { + if err := processTelemetry(ctx, body, store, log); err != nil { // Битый envelope → DLQ (а не бесконечный ретрай и не потеря): // кладём тело в DLQ, затем подтверждаем основное сообщение. if errors.Is(err, errInvalidEnvelope) { @@ -115,7 +117,7 @@ func Run(ctx context.Context, cfg *config.Config, sqsClient *sqs.Client, store * // зациклиться навсегда (находка #2): после maxReceiveCount // дропаем битое с громким логом. if dlqURL != "" { - if derr := sendToDLQ(ctx, sqsClient, dlqURL, *msg.Body, log); derr == nil { + if derr := sendToDLQ(ctx, sqsClient, dlqURL, body, log); derr == nil { pending = append(pending, pendingAck{aws.ToString(msg.ReceiptHandle), aws.ToString(msg.MessageId)}) continue } else {