docs/BRAINSTORM-MICROSERVICES-2026-02-21.md

66 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Брейншторм: Микросервисные паттерны
Дата: 2026-02-21
## Контекст
Team Board = микросервисная архитектура: Tracker (ядро), Picogent (агенты), Bridges (Telegram, OpenClaw), Web Client, BFF.
## Принятые паттерны
### ✅ Event Bus (Redis Streams) — КЛЮЧЕВОЕ
Redis Streams как шина событий между Tracker и потребителями.
**Проблема:** WS-событие теряется если клиент offline. При reconnect — пропущенные сообщения потеряны.
**Решение:** Tracker пишет события в Redis Stream → потребители (agents, bridges) читают из stream. Если потребитель был offline → при reconnect читает с последнего обработанного offset.
**Плюсы:**
- Persistent queue — события не теряются
- Consumer groups — несколько потребителей одного потока
- Replay — можно перечитать историю
- Redis у нас уже есть (порт 6380)
**Статус:** нужно продумать детали (формат событий, consumer groups, retention policy).
### ✅ Saga Pattern (компенсации)
Каждый шаг агента имеет компенсацию при сбое.
Пример:
1. `take_task(42)` → задача in_progress
2. Агент работает...
3. Агент упал (heartbeat timeout)
4. Компенсация: задача → todo, комментарий "Агент упал, задача возвращена"
### ✅ Idempotency
Каждое сообщение/событие имеет уникальный ID.
Повторная доставка с тем же ID → игнорируется.
Критично для reliable delivery через Event Bus.
### ✅ Centralized Logging
Все сервисы: structured JSON logging (Pino для Node.js, structlog для Python).
Единый формат → возможность агрегации.
### ✅ Circuit Breaker
Exponential backoff при недоступности Tracker.
Picogent уже реализует (1s → 2s → 4s → ... → 30s cap).
Event Bus частично решает: если Tracker упал, события копятся в Redis.
## Отклонённые
### ❌ Service Discovery
Один Tracker — overkill.
### ❌ API Gateway (BFF для всех)
Бессмысленно отдельный BFF если все через него. BFF остаётся только для Web Client.
### ❌ Health Check / Readiness Probe
Агенты должны быть доступны по IP:port — слишком сложно. Heartbeat через WS достаточен.
## На подумать
### ⚠️ Event Bus: детали реализации
- Tracker пишет в Redis Stream или в Redis Pub/Sub?
- Streams = persistent, Pub/Sub = volatile
- Consumer groups для multi-instance агентов?
- Retention policy (сколько хранить)?
- WS остаётся как транспорт до клиента, но sourced из Redis?