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 — единственная нейтральная точка; любой движок подключается как участник (прямой или через адаптер), не как второй центр.