Перейти к содержанию

ADR 0002: Выбор движков/рантаймов участников

  • Статус: принято
  • Дата: 2026-06-13
  • Связано: #30, participant-contract.md, event-bus-concept.md разделы 1, 4, 10

Контекст

NATS JetStream — основная шина; вокруг неё зоопарк участников, соблюдающих контракт. Перебрали кандидаты на «движки/рантаймы участников»: Inngest, Windmill, OpenFaaS, faasd, Benthos, Modal. Нужна карта, чтобы выбирать по потребности, а не плодить платформы.

Ключевой принцип: шина рантайм-агностична — участником может быть что угодно, лишь бы соблюдало контракт. Значит выбор движка — это вопрос операционной целесообразности на нашем фундаменте (Coolify + Docker Compose + NATS), а не возможностей.

Решение

Не самохостить FaaS-платформу на одном хосте; компоновать слои под конкретную потребность:

Потребность Инструмент Почему
Durable многошаговое (стейт, ретраи, flow control) Inngest событийное durable-ядро; уже работает
Декларативный глю: трансформация/роутинг/обогащение Benthos / Bento один контейнер, NATS-нативен, no-code, ложится на Coolify
Произвольный код-участник (Go/TS/Python) participant-* шаблоны Docker-нативно, под Coolify, на контракте
Внутренние UI / ops-скрипты / human-in-the-loop / админ-cron Windmill то, чего нет у Inngest; compose-деплоимый
Эластичный/тяжёлый компьют, scale-to-zero, GPU Modal (managed) serverless без K8s; бэкенд участника, не член шины
(если автоскейл-FaaS станет болью) K8s: OpenFaaS / Knative отдельная инфра-ставка, не «ещё стек»

Что отвергнуто и почему

  • faasd — containerd+systemd, не интегрируется с Coolify-Docker (параллельная платформа, кросс-рантайм сеть до шины), и без автоскейла (главный смысл FaaS — только в K8s-варианте). Цена > пользы на нашем фундаменте.
  • Полный OpenFaaS / Knative сейчас — требуют K8s; брать, когда боль автоскейла реальна (раздел 10), как отдельную инфру.
  • Второй durable-движок ради тех же воркфлоу — размывает ясность ответственности; углублять Inngest, а не дублировать.

Последствия

  • (+) Каждая потребность закрыта инструментом, нативным нашему стеку.
  • (+) Нет операционной фрагментации (всё — либо compose-сервис Coolify, либо managed Modal).
  • (−) Несколько инструментов вместо одного «всё-в-одном» — но это и есть гетерогенность по построению; их связывает только контракт шины.

Граница незыблема: NATS — единственная нейтральная точка; любой движок подключается как участник (прямой или через адаптер), не как второй центр.