doc: архитектура event-trigger — выбран Вариант A (отдельный event-dispatcher)
This commit is contained in:
@@ -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-консоль
|
||||
|
||||
### Хранение кода функций
|
||||
|
||||
Reference in New Issue
Block a user