From 1aac3f5093e14fcb69ab0e2d8991131e92f56da8 Mon Sep 17 00:00:00 2001 From: Naeel Date: Thu, 19 Mar 2026 13:21:57 +0300 Subject: [PATCH] =?UTF-8?q?doc:=20=D0=B0=D1=80=D1=85=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D1=83=D1=80=D0=B0=20event-trigger=20=E2=80=94=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B1=D1=80=D0=B0=D0=BD=20=D0=92=D0=B0=D1=80=D0=B8?= =?UTF-8?q?=D0=B0=D0=BD=D1=82=20A=20(=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20event-dispatcher)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/decisions/log.md | 62 ++++++++++++++++++++++++++++++++++++++++++++ doc/progress.md | 19 +++++++++++++- 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/doc/decisions/log.md b/doc/decisions/log.md index deeb862..6ab5fce 100644 --- a/doc/decisions/log.md +++ b/doc/decisions/log.md @@ -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://..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-консоль ### Хранение кода функций diff --git a/doc/progress.md b/doc/progress.md index 5d083d1..5c7a008 100644 --- a/doc/progress.md +++ b/doc/progress.md @@ -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)