🚀 NATS JetStream: K8s deployment + streams + job schema v1
- K8s deployment (2 replicas, PVC, initContainer для server_name) - Streams definitions (MM_ONLINE, MM_OFFLINE, MM_WRITE, MM_EVENTS) - Job payload schema (JSON v1 з idempotency) - Worker contract (capabilities + ack/retry) - Init streams script - Оновлено ARCHITECTURE-150-NODES.md (Control-plane vs Data-plane) TODO: Auth (nkeys), 3+ replicas для prod, worker-daemon implementation
This commit is contained in:
@@ -18,6 +18,50 @@
|
||||
|
||||
---
|
||||
|
||||
## 🎛️ Control-plane vs Data-plane
|
||||
|
||||
### Control-plane (людський + командний)
|
||||
|
||||
**Matrix Rooms** = контроль, команди, статуси, аудит
|
||||
|
||||
**Призначення:**
|
||||
- Команди користувачів/агентів
|
||||
- Статуси виконання (progress + summary)
|
||||
- Ручне керування
|
||||
- Аудит рішень
|
||||
- Оповіщення про помилки/алерти
|
||||
|
||||
**НЕ використовується для:**
|
||||
- Високочастотної job-шини
|
||||
- Масових обчислень
|
||||
- Real-time streaming даних
|
||||
|
||||
### Data-plane (масові таски, fan-out/fan-in)
|
||||
|
||||
**NATS JetStream** = черга задач, розподіл обчислень
|
||||
|
||||
**Призначення:**
|
||||
- Розподіл jobs між воркерами
|
||||
- Fan-out/fan-in обчислень
|
||||
- Retry/ack механізми
|
||||
- Пріоритизація (online/offline)
|
||||
- Idempotency гарантії
|
||||
|
||||
**Переваги:**
|
||||
- Легкий (менше ресурсів ніж Kafka)
|
||||
- Швидкий (low latency)
|
||||
- Простіший для старту
|
||||
- At-least-once delivery
|
||||
- Підтримка idempotency keys
|
||||
|
||||
### State & Index
|
||||
|
||||
**PostgreSQL** = state (організації, користувачі, threads, events)
|
||||
**Qdrant** = retrieval index (semantic search)
|
||||
**Neo4j** = graph relationships
|
||||
|
||||
---
|
||||
|
||||
## 📊 Поточна структура БД (що правильно, що треба виправити)
|
||||
|
||||
### PostgreSQL
|
||||
@@ -134,40 +178,74 @@
|
||||
|
||||
---
|
||||
|
||||
## 📦 Схема черг (NATS JetStream) під Memory Module
|
||||
## 📦 NATS JetStream: Streams + Consumers
|
||||
|
||||
### Мінімум 5 потоків:
|
||||
### Streams (4 основні)
|
||||
|
||||
1. **`mem.embed.online`** — embeddings для діалогів (пріоритет: high)
|
||||
2. **`mem.embed.offline`** — бекфіл/індексація (пріоритет: low)
|
||||
3. **`mem.qdrant.upsert`** — запис векторів
|
||||
4. **`mem.summarize.rollup`** — rolling summaries
|
||||
5. **`mem.memory.distill`** — витяг фактів у long-term memory
|
||||
#### STREAM `MM_ONLINE`
|
||||
- **Subjects:** `mm.embed.online`, `mm.retrieve.online`, `mm.summarize.online`
|
||||
- **Retention:** limits
|
||||
- **MaxAge:** 30 хв (або 2 год)
|
||||
- **Ack:** explicit
|
||||
- **MaxDeliver:** 3
|
||||
- **Backoff:** 1s, 5s, 30s
|
||||
- **Replicas:** 3
|
||||
|
||||
### Формат Job:
|
||||
#### STREAM `MM_OFFLINE`
|
||||
- **Subjects:** `mm.embed.offline`, `mm.index.offline`, `mm.backfill.offline`
|
||||
- **Retention:** limits
|
||||
- **MaxAge:** 7-30 днів
|
||||
- **MaxDeliver:** 10
|
||||
- **Backoff:** 10s, 1m, 5m, 30m
|
||||
- **Replicas:** 3
|
||||
|
||||
```json
|
||||
{
|
||||
"job_id": "uuid",
|
||||
"idempotency_key": "thread-123-embed-v1",
|
||||
"org_id": "uuid",
|
||||
"workspace_id": "uuid",
|
||||
"user_id": "uuid",
|
||||
"agent_id": "uuid",
|
||||
"thread_id": "uuid",
|
||||
"requirements": {
|
||||
"needs_gpu": true,
|
||||
"min_vram_gb": 8,
|
||||
"priority": "high|normal|low",
|
||||
"max_latency_ms": 5000,
|
||||
"tier": "A|B|C"
|
||||
},
|
||||
"payload_ref": "s3://bucket/job-123.json",
|
||||
"payload_inline": {...},
|
||||
"created_at": "2026-01-10T19:30:00Z",
|
||||
"deadline": "2026-01-10T19:35:00Z"
|
||||
}
|
||||
```
|
||||
#### STREAM `MM_WRITE`
|
||||
- **Subjects:** `mm.qdrant.upsert`, `mm.pg.write`, `mm.neo4j.write`
|
||||
- **Retention:** limits
|
||||
- **MaxAge:** 1-7 днів
|
||||
- **MaxDeliver:** 10
|
||||
- **Replicas:** 3
|
||||
|
||||
#### STREAM `MM_EVENTS`
|
||||
- **Subjects:** `mm.event.audit`, `mm.event.status`
|
||||
- **Retention:** limits
|
||||
- **MaxAge:** 7-30 днів
|
||||
- **Replicas:** 3
|
||||
|
||||
### Consumer Policies
|
||||
|
||||
#### Online Consumer (Tier A)
|
||||
- **Stream:** `MM_ONLINE`
|
||||
- **Consumer:** `online-worker-tier-a`
|
||||
- **Ack Wait:** 30s
|
||||
- **Max Ack Pending:** 5000
|
||||
- **Concurrency:** 50-200 (per worker)
|
||||
- **Filter:** `tier=A` AND `needs_gpu=true` (для GPU jobs)
|
||||
|
||||
#### Offline Consumer (Tier B)
|
||||
- **Stream:** `MM_OFFLINE`
|
||||
- **Consumer:** `offline-worker-tier-b`
|
||||
- **Ack Wait:** 5-30 хв
|
||||
- **Max Ack Pending:** 10000
|
||||
- **Concurrency:** висока, але з backpressure
|
||||
- **Preemption:** можливе призупинення для online jobs
|
||||
|
||||
### Job Payload Schema
|
||||
|
||||
Детальна схема: `infrastructure/nats/job-payload-schema.json`
|
||||
|
||||
**Ключові поля:**
|
||||
- `job_id` (ULID)
|
||||
- `idempotency_key` (SHA256 hash) — обов'язково для safe retries
|
||||
- `type` (embed|retrieve|summarize|qdrant_upsert|pg_write|neo4j_write|index)
|
||||
- `priority` (online|offline)
|
||||
- `requirements` (needs_gpu, min_vram_gb, max_latency_ms, tier)
|
||||
- `tenant` (org_id, workspace_id)
|
||||
- `scope` (user_id, agent_id, thread_id)
|
||||
- `input` (text, model, dims)
|
||||
- `refs` (event_id, memory_id, artifact_uri)
|
||||
- `trace` (trace_id, parent_span_id)
|
||||
- `timestamps` (created_at, deadline)
|
||||
|
||||
---
|
||||
|
||||
@@ -204,6 +282,39 @@
|
||||
|
||||
---
|
||||
|
||||
## 📈 Метрики та Алерти
|
||||
|
||||
### NATS JetStream Metrics
|
||||
|
||||
- `nats_consumer_lag{stream, consumer}` — backlog по streams
|
||||
- `nats_redeliveries_total{stream}` — кількість retries
|
||||
- `nats_ack_pending{stream, consumer}` — jobs в обробці
|
||||
- `nats_stream_storage_bytes{stream}` — використання диску
|
||||
|
||||
### Worker Metrics
|
||||
|
||||
- `worker_jobs_processed_total{type, status}` — загальна кількість jobs
|
||||
- `worker_job_duration_seconds{type, quantile}` — latency (p50, p95, p99)
|
||||
- `worker_gpu_utilization{node_id}` — використання GPU
|
||||
- `worker_vram_usage_bytes{node_id}` — використання VRAM
|
||||
- `worker_errors_total{type, error_type}` — помилки
|
||||
|
||||
### Алерти → Matrix Ops Room
|
||||
|
||||
**Критичні:**
|
||||
- `MM_ONLINE backlog > 1000` — SLO порушення
|
||||
- `redeliveries spike > 100/min` — проблеми з воркерами
|
||||
- `embed p95 > 500ms` (target: 300ms)
|
||||
- `disk > 80%` на JetStream PVC
|
||||
- `worker offline > 2 min` (Tier A)
|
||||
|
||||
**Попередження:**
|
||||
- `MM_OFFLINE backlog > 10000`
|
||||
- `ack_pending > 80% max_ack_pending`
|
||||
- `worker_gpu_utilization < 20%` (Tier A, протягом 10+ хв)
|
||||
|
||||
---
|
||||
|
||||
## 📋 Наступні 7 кроків (по порядку)
|
||||
|
||||
### 1. ✅ Ротація секретів + прибрати креденшали з документів/репо
|
||||
@@ -217,11 +328,14 @@
|
||||
- [ ] Додати JWT/mTLS auth
|
||||
- [ ] NetworkPolicy для internal-only
|
||||
|
||||
### 3. Підняти NATS JetStream (Tier A)
|
||||
- [ ] Встановити NATS на NODE1 (K8s)
|
||||
- [ ] Налаштувати JetStream
|
||||
- [ ] Створити streams для Memory Module
|
||||
- [ ] Налаштувати replication (мінімум 3 ноди або 1+backup)
|
||||
### 3. ✅ Підняти NATS JetStream (Tier A)
|
||||
- [x] Створено K8s deployment (3 replicas + PVC + auth)
|
||||
- [x] Створено streams definitions (MM_ONLINE, MM_OFFLINE, MM_WRITE, MM_EVENTS)
|
||||
- [x] Створено job payload schema (JSON v1)
|
||||
- [x] Створено worker contract (capabilities + ack/retry)
|
||||
- [ ] Застосувати deployment в K8s
|
||||
- [ ] Налаштувати operator JWT + system account
|
||||
- [ ] Створити streams через NATS CLI або API
|
||||
|
||||
### 4. Додати worker-daemon на кожну ноду
|
||||
- [ ] Heartbeat до capability registry
|
||||
|
||||
Reference in New Issue
Block a user