From 607aebb8efba8b6bc694767cbbe023d8d3a6ed6c Mon Sep 17 00:00:00 2001 From: Repinoid Date: Sat, 10 Oct 2026 16:19:54 +0300 Subject: [PATCH] =?UTF-8?q?doc:=20durability=20SendMessageBatch=20+=20bill?= =?UTF-8?q?ing=20(=D0=BF=D1=80=D0=B5=D0=B4=D1=83=D1=81=D0=BC=D0=BE=D1=82?= =?UTF-8?q?=D1=80=D0=B5=D0=BD,=20=D0=B2=D1=8B=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-10-10-session-log.md | 5 +++++ .../vm-public-entrypoint-2026-10-10.md | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/HISTORY/2026-10-10-session-log.md b/HISTORY/2026-10-10-session-log.md index eaf93a7..ad564c4 100644 --- a/HISTORY/2026-10-10-session-log.md +++ b/HISTORY/2026-10-10-session-log.md @@ -122,6 +122,11 @@ - Нужно для ЛЮБОГО multi-instance варианта; в одном процессе — страховка. - Проверено: индекс заполнен (`hlen ssq:tenant_ak` = 1), регрессий нет. +### 2.15. Durability batch + billing +- `SendMessageBatch` переведён на `SaveMessagesSync` (было async) + не персистит дубли (коммит `3559414`). +- Проверено: batch в пустую очередь пережил рестарт. +- Billing — предусмотрен (модуль есть), но выключен (`BILLING_PG_HOST` не задан). Решение: включить позже. + ## 3. Грабли (для повторного использования) 1. **`proxy_set_header Host $host` теряет порт** → SigV4 `SignatureDoesNotMatch`. diff --git a/doc/thinking/vm-public-entrypoint-2026-10-10.md b/doc/thinking/vm-public-entrypoint-2026-10-10.md index e04bb26..87221bf 100644 --- a/doc/thinking/vm-public-entrypoint-2026-10-10.md +++ b/doc/thinking/vm-public-entrypoint-2026-10-10.md @@ -155,3 +155,21 @@ curl -sS https://sqs.sinefo.ru/health **Почему пока два листенера в одном процессе, а не два процесса:** состояние (очереди/тенанты) — in-memory; два процесса разъедутся (админка создаст тенанта в своей памяти — data-plane его не увидит). Полноценный процесс-split — после Шага 3 (Redis как источник истины). + +## 11. Надёжность записи (durability) и billing (2026-10-10) + +### 11.1. Синхронная запись критичных операций +- `SendMessage` — sync (`SaveMessageSync`, фикс P1.1) ✅ +- `DeleteMessage` / `DeleteMessageBatch` — sync (`DeleteMessagePersist`/`DeleteMessagesPersist`) ✅ +- **`SendMessageBatch` — ИСПРАВЛЕНО (коммит `3559414`):** было `SaveMessages` (async) → стало + `SaveMessagesSync` (ответ 200 только после записи всех сообщений; при ошибке — откат append). + Заодно: не персистим дубли (раньше в Redis попадали дубликаты, которых нет в очереди). +- Проверено: batch из 2 сообщений в пустую очередь **пережил рестарт** сервиса. +- Остаётся async: `SaveQueue` (метаданные очереди: FIFO-состояние, duplicates) и метаданные + в Create/Delete/SetAttributes/Purge/Tags — потеря возможна только в узком окне при крахе; + сами сообщения защищены. + +### 11.2. Billing — предусмотрен, но НЕ включён +- Модуль есть (`app/billing`, PG-воркер + буфер), включается через `BILLING_PG_HOST` (сейчас не задан). +- Решение: **оставить выключенным**; включать, когда появятся реальные клиенты/тарификация. +- Учёт операций уже рассчитан под биллинг — при включении заработает без изменений ядра.