8.8 KiB
8.8 KiB
Context
Решение владельца 12.10.2026: «топики можно выставлять через секреты и jwt токен тоже, т.к. у нас будут различные наборы топиков и разные jwt для прод и тест окружения». Выбран подход 1 из трёх обсуждённых (12.10.2026):
- Выбран: три ключа в группе
OPENBAO__NATS__, одинаковые в трёх сервисах. OPENBAO__APP__*(settings_sources.py) — отвергнут: разносит JWT и subject'ы, на которые он даёт права, по разным группам.- Один префикс
NATS_SUBJECT_PREFIX— отвергнут: работает, только если тестовые subject'ы платформы отличаются от боевых префиксом.
Образец — RSHB/armka_file_worker (проверен в контуре): NATSSettings с NATS_URL, NATS_JWT: SecretStr,
NATS_SEED: SecretStr, NATS_COMMAND_SUBJECT, NATS_EVENT_SUBJECT; Settings(hide_input_in_errors=True).
| Ключ | Умолчание | arm-core | tabular-parser | scan-gateway |
|---|---|---|---|---|
OPENBAO__NATS__NATS_TABULAR_REQUEST_SUBJECT |
files.tabular_uploaded |
публикует | подписан (queue tabular-parser) |
— |
OPENBAO__NATS__NATS_IMAGE_REQUEST_SUBJECT |
files.img_uploaded |
публикует | — | подписан (queue scan-gateway) |
OPENBAO__NATS__NATS_RESULT_SUBJECT |
files.tabular_parsed |
подписан (queue arm-core) |
публикует | публикует |
Goals / Non-Goals
Goals: subject'ы и учётные данные NATS задаются секретами окружения; разъехавшиеся настройки видны в /healthcheck;
тесты не делят subject'ы со стендом. Non-goals: см. proposal.
Decisions
- Ключи одинаковые во всех трёх сервисах, проверяются все три. На окружение — один набор секретов, который платформа кладёт всем сервисам; сервис использует только свои subject'ы, но валидирует все три, чтобы ошибка набора проявилась в любом сервисе одинаково.
- Валидация при старте. Имя subject'а — непустое, без пробельных символов, без шаблонов
*и>, без пустых токенов (a..b, ведущая или завершающая точка). Три имени попарно различны: совпадение запроса и ответа — сервис получает собственные ответы; совпадение двух запросов — каждый запрос получают оба сервиса. Ошибка — сервис не стартует (ошибка конфигурации, как уDB_SCHEMA). - Константы
contract/subjects.py— только умолчания. Код публикации и подписок получает имена из настроек; функция выбора subject'а поpipelineпринимает настройки (форма — на усмотрение плана сервиса). - Секреты.
NATS_JWTиNATS_SEED—SecretStr; в колбэки nkeys значение передаётся черезget_secret_value();Settingsсhide_input_in_errors=True, чтобы ошибка валидации конфигурации не печатала входные значения. /healthcheck. Новый объектsubjectsс subject'ами, которые использует сервис: arm-core —tabular_request,image_request,result; tabular-parser —tabular_request,result; scan-gateway —image_request,result. Отдаётся всегда, в том числе приnats = off | down(это конфигурация, не состояние). Решение владельца 12.10.2026: «пусть будет в хэлзчеке».- Лог при старте. Сервис пишет свои subject'ы одной строкой при старте (существующая строка «Подписка NATS активна» сохраняется).
- Тесты (OQ-83). Интеграционные тесты
tabular-parserиscan-gateway, где обе стороны обмена — в самом тесте, задают уникальные subject'ы через настройки и не пересекаются с контейнерами стенда. e2e ядра (make e2e) остаётся на subject'ах по умолчанию: он гоняет настоящий контейнерtabular-parserстенда, который слушает умолчания, а конфликт там — в общей queue grouparm-coreна subject'е ответа; требование останавливать ядро стенда сохраняется (R-7). Интеграционные тесты NATS ядра уже работают на уникальных subject'ах.
Risks / Trade-offs
- Разъехавшиеся настройки ядра и сервиса — тишина на шине: ядро переведёт задания в
dlqпоNO_ACK. Смягчение:subjectsв/healthcheckи лог при старте; в03-architecture.md— требование задавать набор всем трём сервисам. - JWT окружения без прав на заданные subject'ы — ошибка прав NATS при подписке/публикации (в логе сервиса); смягчение
— перечень секретов окружения в
03-architecture.mdиcontour-transfer-guide.md. /healthcheckпубличен и теперь раскрывает имена subject'ов. Имена не секретны (без JWT ими не воспользоваться), JWT и seed в ответ не попадают.
Decisions made without discussion
- 12.10.2026 — R-1: имена ключей
NATS_TABULAR_REQUEST_SUBJECT,NATS_IMAGE_REQUEST_SUBJECT,NATS_RESULT_SUBJECT(по образцу FileWorker — префиксNATS_, суффикс_SUBJECT), а неNATS_COMMAND_SUBJECT/NATS_EVENT_SUBJECTFileWorker: у нас два subject'а запроса. Имена показаны владельцу в дизайне и приняты вместе с подходом. Цена ошибки: низкая — переименование ключа до выката в контур. - 12.10.2026 — R-2:
schema_versionне меняется: тела сообщений те же, subject'ы — окружение (как R-2 вnats-files-subjects). Цена ошибки: низкая. - 12.10.2026 — R-3: проверяются все три subject'а в каждом сервисе, включая неиспользуемые им (решение 1). Цена ошибки: низкая — лишний отказ старта при кривом наборе, который всё равно сломал бы обмен.
- 12.10.2026 — R-4:
subjectsв/healthcheckотдаётся и приnats = off. Цена ошибки: низкая. - 12.10.2026 — R-5: пароли MinIO/SMB в
SecretStrне переводятся — вне запроса владельца;hide_input_in_errorsвсё равно скрывает их в ошибках валидации. Цена ошибки: пароли видны вrepr(settings)до отдельной задачи. - 12.10.2026 — R-6: маршрут — OpenSpec change
nats-env-configв каждом из четырёх репозиториев, один план SDD на все четыре (больше пяти задач — SDD-контроллер). Цена ошибки: низкая, процессная. - 12.10.2026 — R-7: e2e ядра не переводится на свои subject'ы (решение 7): ему нужен контейнер
tabular-parserстенда на умолчаниях, а развести ядро теста и ядро стенда может только своя queue group, которая в этом change не настраивается. OQ-83 дляmake e2eостаётся открытым. Цена ошибки: передmake e2eпо-прежнему останавливать ядро стенда.