doc: архитектура event-trigger — выбран Вариант A (отдельный event-dispatcher)

This commit is contained in:
Naeel
2026-03-19 13:21:57 +03:00
parent d286d92a05
commit 1aac3f5093
2 changed files with 80 additions and 1 deletions
+62
View File
@@ -1,5 +1,67 @@
# Решения и обоснования
## 2026-03-19 — Архитектура event-trigger (Вариант A: отдельный event-dispatcher)
### Контекст
До этого event-monitor/writer/cleaner работали как пользовательские sless-функции
в namespace юзера — это неправильно: они ходили в операторскую Postgres напрямую,
создавали таблицы без миграций, зависели от self-hosted rabbitmq.
Всё это удалено из кластера (audit 2026-03-19).
### Варианты которые рассматривались
**Вариант A: отдельный event-dispatcher сервис** ← ВЫБРАН
**Вариант B: dispatcher встроен горутиной в оператор**
**Вариант C: CronJob polling из очереди**
### Решение: Вариант A
**Почему не B:** AMQP-соединения внутри operator reconciler усложняют lifecycle
и тестирование. Падение AMQP затронет весь оператор.
**Почему не C:** polling — не realtime, не масштабируется, неловкий ACK.
**Почему A:** чистое разделение ответственности. Оператор управляет CRD,
dispatcher управляет AMQP. Независимые restart/deploy. Легко тестировать отдельно.
### Поток данных
```
Пользователь:
kubectl apply — Trigger{type:event, queue:"orders", functionRef:"my-func"}
sless-operator (trigger_controller.go):
reconcileEvent → валидирует что Function существует
→ устанавливает status.active = true
event-dispatcher (services/event-dispatcher/):
k8s informer наблюдает Trigger CRD по всем namespace
При type=event → amqp.Channel.Consume(spec.queue)
При сообщении → POST http://<fn-svc>.<fn-ns>.svc.cluster.local:8080/
→ 2xx → ack
→ не 2xx / timeout → nack (requeue)
При удалении Trigger → закрыть consumer
```
### Что меняется в коде
| Файл | Изменение |
|------|-----------|
| `api/v1alpha1/trigger_types.go` | +TriggerTypeEvent, +Queue в TriggerSpec |
| `controllers/trigger_controller.go` | +reconcileEvent (валидация + status) |
| `internal/config/config.go` | +RabbitMQURL |
| `services/event-dispatcher/` | новый Go-сервис (main + dispatcher + watcher) |
| `deployments/k8s/event-dispatcher.yaml` | Deployment + ServiceAccount + ClusterRole |
### Инфраструктура
RabbitMQ: managed через Nubes (Вариант A требует стабильного брокера).
- Управляется rabbitmq-operator в namespace `operators`
- namespace: `1dbfe9da-ce1c-4958-b359-d016a4b455c8`
- host: `rabbitmqk8s.1dbfe9da-ce1c-4958-b359-d016a4b455c8.svc.cluster.local`
- credentials: в `sless-operator-secret` (RABBITMQ_URL) — добавить при деплое
## 2026-03-18 — Архитектура: funcs как глобальный сервис, web-консоль
### Хранение кода функций
+18 -1
View File
@@ -1,6 +1,23 @@
# Прогресс разработки
Последнее обновление: 2026-03-19 09:00
Последнее обновление: 2026-03-19 14:00
## 2026-03-19 — event-trigger refactor (ветка feat/event-trigger-refactor)
| # | Задача | Статус | Заметки |
|---|--------|--------|---------|
| 1 | Аудит кластера — удаление мусора | ✅ | Удалены: event-monitor/writer/cleaner, pg-* тестовые функции, failed build jobs, orphan namespaces b1e4df2d/b794a3c4 |
| 2 | Managed RabbitMQ через Terraform | ✅ | `terraform/RABBIT/`, ns `1dbfe9da-...`, host: `rabbitmqk8s.1dbfe9da-...svc.cluster.local` |
| 3 | Архитектура event-trigger задокументирована | ✅ | `doc/decisions/log.md` — выбран Вариант A (отдельный event-dispatcher) |
| 4 | trigger_types.go: +TriggerTypeEvent, +Queue | 🔄 | В работе |
| 5 | internal/config: +RabbitMQURL | ⏳ | |
| 6 | services/event-dispatcher/ | ⏳ | |
| 7 | controllers/trigger_controller.go: +reconcileEvent | ⏳ | |
| 8 | deployments/k8s/event-dispatcher.yaml | ⏳ | |
| 9 | Обновить sless-operator-secret (RABBITMQ_URL) | ⏳ | |
| 10 | Коммит + пуш | ⏳ | |
## 2026-03-19 — pg-table-writer HTML + bugfix invoke.go Content-Length (оператор v0.1.37)