From 2b3838680f606ee782948ecff2f3f2be76d5cf13 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Wed, 7 Oct 2026 07:38:27 +0300 Subject: [PATCH] =?UTF-8?q?doc(HISTORY):=20=D0=B0=D1=80=D1=85=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D1=81=D0=BA=D0=B8=D0=B9=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=B1=D0=BE=D1=80=20=D1=82=D0=B5=D0=BB=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D0=B8=D0=B8=20=E2=80=94=205=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=20=D0=B8=20=D1=80=D0=B5=D1=88?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-10-07-session-log.md | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/HISTORY/2026-10-07-session-log.md b/HISTORY/2026-10-07-session-log.md index 8b5fb81..6bc10ee 100644 --- a/HISTORY/2026-10-07-session-log.md +++ b/HISTORY/2026-10-07-session-log.md @@ -79,5 +79,39 @@ (вычистить легаси `internal/api/`, `cmd/sqs-consumer`). - Платформенные проблемы (wss ~150с, MSS/MTU) — вне кода. +--- + +## Архитекторский разбор (Дипсик Про, по итогам перепроверки) + +Перечитана цепочка `bridge → SQS → consumer → iotpg` целиком. Найдены 5 проблем +(часть — мой же недочёт при кодинге P0-7/P0-8): + +1. 🔴 **Залипание на «ядовитом» батче.** После моего фикса «возвращаем строки в + буфер при ошибке» один payload, падающий не по `ON CONFLICT`, зацикливает + flush этого namespace навсегда (flusher каждые 200мс). Так «тихая потеря» + превратилась в «вечное залипание». ← моя ошибка: фикс без различения типов ошибок. +2. 🔴 **Битый envelope теряется безвозвратно.** `processTelemetry` на битый JSON + возвращает `nil` → consumer подтверждает (DeleteMessage) → мусор исчезает без + следа. Если мусор шлёт bridge по багу — данные теряются навсегда, без DLQ. +3. 🟠 **Нарушение порядка телеметрии.** `ts` ставится `now()` в БД при INSERT, а + не в момент приёма (`ReceivedAt` из envelope не идёт в батч). При батчинге и + нескольких потоках порядок для device_id не гарантирован. +4. 🟠 **Дублирование / нет дедупа для `message_id=""`.** `ON CONFLICT` по + `(device_id, message_id)` не ловит NULL: legacy `cmd/sqs-consumer` передаёт + `""` → дубли вставляются. Плюс гонка InsertTelemetry(full) ↔ flusher на одном + namespace = два параллельных INSERT. +5. 🟡 **Close() может потерять последний батч** при ошибке shutdown-flush + (`_ = flushAll(...)` — ошибка игнорируется). + +### Решение (как принято) +- п.1 + п.3 (битые/ядовитые → DLQ) — делаю я (Дипсик Про), это дизайн-развилки. +- п.2 + п.4 (ReceivedAt; message_id NOT NULL) — передаются Флашу, с критериями. +- Битое сообщение — **в DLQ** (стандартный паттерн: valid→process, invalid→DLQ). +- Ядовитый SQL-батч — различать retryable (сеть/PG лежит → ретрай в буфер) от + permanent (нарушение constraint → не вешать namespace, выброс в лог/DLQ). + +### Статус +Реализация п.1 (разделение ошибок flush) и п.3 (ббитые → DLQ) — см. ниже. + ## Проверки - `go build ./...` и `go vet ./internal/...` — зелёные на каждом шаге.