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-консоль
|
## 2026-03-18 — Архитектура: funcs как глобальный сервис, web-консоль
|
||||||
|
|
||||||
### Хранение кода функций
|
### Хранение кода функций
|
||||||
|
|||||||
+18
-1
@@ -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)
|
## 2026-03-19 — pg-table-writer HTML + bugfix invoke.go Content-Length (оператор v0.1.37)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user