- 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
124 lines
2.9 KiB
Markdown
124 lines
2.9 KiB
Markdown
# Worker Daemon — Memory Module
|
||
|
||
**Дата:** 2026-01-10
|
||
**Версія:** 1.0.0
|
||
|
||
---
|
||
|
||
## 📋 Призначення
|
||
|
||
Worker daemon запускається на кожній ноді і:
|
||
1. Реєструє capabilities в capability registry
|
||
2. Підписується на NATS consumers
|
||
3. Виконує jobs з перевіркою requirements
|
||
4. Звітує метрики та статуси
|
||
|
||
---
|
||
|
||
## 🔧 Deployment
|
||
|
||
### K8s (NODE1, NODE3)
|
||
|
||
```yaml
|
||
apiVersion: apps/v1
|
||
kind: DaemonSet
|
||
metadata:
|
||
name: memory-worker
|
||
namespace: daarion
|
||
spec:
|
||
selector:
|
||
matchLabels:
|
||
app: memory-worker
|
||
template:
|
||
metadata:
|
||
labels:
|
||
app: memory-worker
|
||
spec:
|
||
containers:
|
||
- name: worker
|
||
image: memory-worker:latest
|
||
env:
|
||
- name: NODE_ID
|
||
valueFrom:
|
||
fieldRef:
|
||
fieldPath: metadata.name
|
||
- name: TIER
|
||
value: "A" # або B, C
|
||
- name: NATS_URL
|
||
value: "nats://nats-client.nats:4222"
|
||
- name: CAPABILITY_REGISTRY
|
||
value: "postgresql://..." # або Consul
|
||
```
|
||
|
||
### Docker (NODE2)
|
||
|
||
```bash
|
||
docker run -d \
|
||
--name memory-worker \
|
||
-e NODE_ID=node2-macbook-m4 \
|
||
-e TIER=C \
|
||
-e NATS_URL=nats://nats-client.nats:4222 \
|
||
memory-worker:latest
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 Capability Registry Schema
|
||
|
||
### Postgres Table
|
||
|
||
```sql
|
||
CREATE TABLE worker_capabilities (
|
||
node_id VARCHAR(255) PRIMARY KEY,
|
||
tier VARCHAR(10) NOT NULL,
|
||
region VARCHAR(50),
|
||
trust_zone VARCHAR(50),
|
||
hardware JSONB NOT NULL,
|
||
capabilities JSONB NOT NULL,
|
||
status VARCHAR(20) NOT NULL,
|
||
last_heartbeat TIMESTAMP WITH TIME ZONE NOT NULL,
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
CREATE INDEX idx_worker_capabilities_tier ON worker_capabilities(tier);
|
||
CREATE INDEX idx_worker_capabilities_status ON worker_capabilities(status);
|
||
CREATE INDEX idx_worker_capabilities_heartbeat ON worker_capabilities(last_heartbeat);
|
||
```
|
||
|
||
---
|
||
|
||
## 🔄 Worker Flow
|
||
|
||
1. **Startup:**
|
||
- Реєстрація capabilities в registry
|
||
- Heartbeat (кожні 30s)
|
||
|
||
2. **Job Processing:**
|
||
- Підписка на consumer (durable)
|
||
- Перевірка `requirements` vs `capabilities`
|
||
- Виконання job
|
||
- ACK/NAK
|
||
|
||
3. **Metrics:**
|
||
- Експорт метрик в Prometheus format
|
||
- Відправка алертів в Matrix (якщо потрібно)
|
||
|
||
---
|
||
|
||
## 📁 Структура коду
|
||
|
||
```
|
||
worker-daemon/
|
||
├── main.py # Entry point
|
||
├── registry.py # Capability registry (Postgres/Consul)
|
||
├── nats_client.py # NATS consumer
|
||
├── job_executor.py # Job execution
|
||
├── metrics.py # Prometheus metrics
|
||
└── requirements.txt # Python dependencies
|
||
```
|
||
|
||
---
|
||
|
||
*Документ створено: 2026-01-10 19:30 CET*
|