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{} }