From c3106d6e20c9dc73d655687cd82653096a513fd4 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Sun, 11 Oct 2026 07:51:38 +0300 Subject: [PATCH] =?UTF-8?q?fix(iot):=20ReceivedAt=20=D0=B2=20RFC3339Nano?= =?UTF-8?q?=20(=D0=BF=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D0=BA=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BC=D0=B5=D1=82=D1=80=D0=B8=D0=B8,=20non-FIFO)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bridge пишет, consumer парсит RFC3339Nano (субсекундная точность). Раньше RFC3339 (секунды) + non-FIFO очередь → показания в одну секунду могли встать не в том порядке. Parse RFC3339Nano совместим со старыми RFC3339-сообщениями (доля секунды опциональна). --- internal/service/bridge/handler.go | 2 +- internal/service/consumer/processor.go | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/service/bridge/handler.go b/internal/service/bridge/handler.go index a98dd05..738ec5c 100644 --- a/internal/service/bridge/handler.go +++ b/internal/service/bridge/handler.go @@ -54,7 +54,7 @@ func newMessageHandler(dispatcher *sqsDispatcher, log *slog.Logger) mqtt.Message DeviceID: deviceID, Topic: topic, Payload: rawPayload, - ReceivedAt: time.Now().UTC().Format(time.RFC3339), + ReceivedAt: time.Now().UTC().Format(time.RFC3339Nano), MessageID: uuid.NewString(), }) } diff --git a/internal/service/consumer/processor.go b/internal/service/consumer/processor.go index c7e6a0f..749072c 100644 --- a/internal/service/consumer/processor.go +++ b/internal/service/consumer/processor.go @@ -46,9 +46,11 @@ func processTelemetry(ctx context.Context, body string, store *iotpg.IoTPostgres } return err } - // Время приёма сохраняем в ts (порядок телеметрии). Битый/пустой received_at - // → zero, стор подставит now(). - receivedAt, perr := time.Parse(time.RFC3339, envelope.ReceivedAt) + // Время приёма сохраняем в ts (порядок телеметрии). RFC3339Nano — субсекундная + // точность (очередь non-FIFO: несколько показаний в секунду не должны терять + // порядок). Parse RFC3339Nano принимает и старые RFC3339 (доля секунды опциональна). + // Битый/пустой received_at → zero, стор подставит now(). + receivedAt, perr := time.Parse(time.RFC3339Nano, envelope.ReceivedAt) if perr != nil { receivedAt = time.Time{} }