From c10f927730b0c5acc0029d2105f578ca23f6df68 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Tue, 13 Oct 2026 13:26:44 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B2=D1=8C=D1=8E:=20=D1=83=D0=BC=D0=BE=D0=BB=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20subject'=D0=BE=D0=B2=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D1=8B=20=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit M-3: докстринги worker.py не называют умолчание фактическим subject'ом. T7.1: выровнены переносы докстринга core/nats.py. M-5: CLAUDE.md помечает files.tabular_parsed как умолчание. Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 2 +- api/src/core/nats.py | 7 +++---- api/src/core/worker.py | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index a47c1e3..ac3f99d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,7 +9,7 @@ распознанный документ), склеить и сохранить сырой ответ в S3 `raw/{job_id}.json` (в БД не регистрируется), очистить горячую папку (только при `SCAN_CLEANUP=true`), нормализовать в `../docs/contracts/recognition-result.schema.json` (`statementDocument` v1.2: по одному документу на таблицу `table_structure[i]`), опубликовать `files.tabular_parsed` -(`done` / `needs_check` / `error`). Таймаут → ошибка `TIMEOUT` по `min(reply_deadline, старт + SCAN_TIMEOUT_SECONDS=1200)`, +(по умолчанию; задаётся `OPENBAO__NATS__NATS_*_SUBJECT`) (`done` / `needs_check` / `error`). Таймаут → ошибка `TIMEOUT` по `min(reply_deadline, старт + SCAN_TIMEOUT_SECONDS=1200)`, старт — запись файла во «Входящие». **Нет доступа к БД.** ## Правила diff --git a/api/src/core/nats.py b/api/src/core/nats.py index 163329c..6f41dc1 100644 --- a/api/src/core/nats.py +++ b/api/src/core/nats.py @@ -9,10 +9,9 @@ После переподключения nats-py сам отправляет SUB для всех подписок с прежней queue group — подписку повторно оформлять не нужно. - `subscribe_requests(cb)` — подписка на subject запроса `image` из настроек - (`OPENBAO__NATS__NATS_IMAGE_REQUEST_SUBJECT`, - по умолчанию `files.img_uploaded`) в queue group `scan-gateway`: из нескольких - инстансов сообщение получает ровно один. `cb` получает исходное сообщение nats-py (`msg.data`, `msg.headers`); - исключения `cb` логируются, подписка живёт. + (`OPENBAO__NATS__NATS_IMAGE_REQUEST_SUBJECT`, по умолчанию `files.img_uploaded`) в queue group `scan-gateway`: + из нескольких инстансов сообщение получает ровно один. `cb` получает исходное сообщение nats-py + (`msg.data`, `msg.headers`); исключения `cb` логируются, подписка живёт. - `publish(subject, payload, msg_id)` — публикация с заголовком `Nats-Msg-Id` и `flush` (подтверждение сервером) с повторами на временных ошибках (первая попытка + до `PUBLISH_RETRIES` повторов); исчерпаны — `PublishFailed`. Воркер логирует error и идёт дальше: ядро закроет задание по `reply_deadline` (D-7). diff --git a/api/src/core/worker.py b/api/src/core/worker.py index a02f996..8252f38 100644 --- a/api/src/core/worker.py +++ b/api/src/core/worker.py @@ -107,7 +107,7 @@ class ObjectStorage(Protocol): class ResultPublisher(Protocol): - """Часть `NatsGateway`: публикация конверта в `files.tabular_parsed` с `Nats-Msg-Id` и повторами.""" + """Часть `NatsGateway`: публикация конверта в subject ответа с `Nats-Msg-Id` и повторами.""" async def publish_result(self, message: RecognitionResultMessage, attempt: int) -> None: ... @@ -181,7 +181,7 @@ class _WaitResult: class Worker: - """Обработка запросов `files.img_uploaded` (см. докстринг модуля). + """Обработка запросов на subject запроса `image` (см. докстринг модуля). Зависимости внедряются: `storage` (S3), `publisher` (NATS), `hotfolder`, `normalizer`; `clock` — часы UTC для дедлайна (R-20), `sleep` — пауза между опросами (подмены для тестов).