🚀 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:
Apple
2026-01-10 10:02:25 -08:00
parent 3478dfce5f
commit 8fe0b58978
7 changed files with 1046 additions and 35 deletions

View File

@@ -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