4.1 KiB
4.1 KiB
ADR-0001: Chat Platform Boundaries (GraphQL + Hatchet)
Дата: 2026-03-08
Статус: accepted
Контекст
Нужна минимальная и предсказуемая схема из 5 сервисов:
frontendbackendtelegram_backendtelegram_workerhatchet
Ключевые ограничения:
- основная Prisma/доменная БД только в
backend; telegram_backendиtelegram_workerне содержат CRM-домен и не пишут в основную БД;- взаимодействие между сервисами только через GraphQL;
- асинхронность и ретраи централизованы в Hatchet.
Решение
Принимаем архитектуру:
backend
- владеет доменной моделью чатов и единственной основной Prisma-базой;
- принимает inbound события от
telegram_workerчерез GraphQL (ingestTelegramInbound); - создает outbound задачи в
telegram_backendчерез GraphQL (requestTelegramOutbound); - принимает delivery-отчеты от
telegram_workerчерез GraphQL (reportTelegramOutbound).
telegram_backend
- принимает webhook Telegram;
- нормализует payload в
OmniInboundEnvelopeV1; - ставит задачи в Hatchet (
process-telegram-inbound,process-telegram-outbound); - предоставляет GraphQL API для enqueue и отправки в Telegram API.
telegram_worker
- исполняет задачи Hatchet;
- для inbound вызывает
backend /graphql; - для outbound вызывает
telegram_backend /graphql(sendTelegramMessage), затемbackend /graphql(reportTelegramOutbound); - не имеет собственной Prisma-базы.
hatchet
- единый оркестратор задач, ретраев и backoff-политик.
Потоки
Inbound (Telegram -> CRM)
- Telegram webhook приходит в
telegram_backend. telegram_backendнормализует событие и enqueue в Hatchetprocess-telegram-inbound.telegram_workerисполняет задачу и вызываетbackend.ingestTelegramInbound.backendсохраняет доменные изменения в своей БД.
Outbound (CRM -> Telegram)
backendинициирует отправку (requestTelegramOutbound) вtelegram_backend.telegram_backendenqueue в Hatchetprocess-telegram-outbound.telegram_workerвызываетtelegram_backend.sendTelegramMessage.telegram_workerрепортит итог вbackend.reportTelegramOutbound.
Границы ответственности
backend:
- можно: вся бизнес-логика и состояние;
- нельзя: прямой вызов Telegram API.
telegram_backend:
- можно: webhook ingress, нормализация, enqueue, адаптер Telegram API;
- нельзя: доменные записи CRM.
telegram_worker:
- можно: исполнение задач, ретраи, orchestration шагов;
- нельзя: хранение CRM-состояния и прямой доступ к основной БД.
Надежность
- webhook отвечает
200только после успешной постановки задачи в Hatchet; - при недоступности сервисов задача ретраится Hatchet;
- inbound обработка идемпотентна через
idempotencyKeyи provider identifiers вbackend.
Последствия
Плюсы:
- меньше сервисов и меньше скрытых связей;
- изоляция доменной БД в
backend; - единая точка ретраев/оркестрации (Hatchet).
Минусы:
- выше требования к стабильности GraphQL-контрактов между сервисами;
- нужна наблюдаемость по цепочке
telegram_backend -> hatchet -> telegram_worker -> backend.