P0-8: идемпотентность телеметрии (dedup по message_id)
Envelope получил MessageID (UUID); таблица iot_telemetry — столбец message_id + UNIQUE(device_id,message_id); батч-INSERT ON CONFLICT DO NOTHING. Дубли при at-least-once повторе из SQS больше не вставляются. Пустой message_id → NULL (без ложного дедупа).
This commit is contained in:
@@ -50,9 +50,20 @@
|
||||
- `cmd/iot-service/main.go` — bridge/consumer поднимают/опускают свои флаги;
|
||||
если горутина завершилась (ошибка/падение), `/ready` вернёт 503.
|
||||
|
||||
### P0-8 — идемпотентность телеметрии (dedup по message_id)
|
||||
- `internal/service/bridge/handler.go`: в `TelemetryEnvelope` добавлен `MessageID`
|
||||
(UUID на каждое MQTT-сообщение).
|
||||
- `internal/service/consumer/processor.go`: `MessageID` передаётся в `InsertTelemetry`.
|
||||
- `internal/storage/iotpg/iot_telemetry_store.go`: в таблицу добавлен столбец
|
||||
`message_id` + UNIQUE INDEX `(device_id, message_id)`; батч-INSERT теперь
|
||||
`ON CONFLICT DO NOTHING`. Пустой message_id → NULL (NULL в unique-индексе не
|
||||
конфликтует → без ложного дедупа). При at-least-once повторе из SQS дубликат
|
||||
не вставляется.
|
||||
- Легаси `cmd/sqs-consumer`: вызов обновлён (`""`), файл помечен к удалению (P2-14).
|
||||
|
||||
## Осталось (не сделано)
|
||||
- P0-3 часть 1 (хэш паролей + EMQX), P0-8 (идемпотентность), P1-11/P1-12
|
||||
(тесты/CI), P2-14 (вычистить легаси `internal/api/`).
|
||||
- P0-3 часть 1 (хэш паролей + EMQX), P1-11/P1-12 (тесты/CI), P2-14
|
||||
(вычистить легаси `internal/api/`, `cmd/sqs-consumer`).
|
||||
- Платформенные проблемы (wss ~150с, MSS/MTU) — вне кода.
|
||||
|
||||
## Проверки
|
||||
|
||||
Reference in New Issue
Block a user