villsim/docs/architecture.md

79 lines
3.4 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.

# Архитектура сервера симуляции (Village Sim)
## 1. Технический стек
### Phase 1 (MVP)
* **Core**: Python 3.11+
* **API**: FastAPI
* **Hot State / Broker**: Redis (используется и как БД, и как очередь сообщений)
* **Analytics**: JSON Logs (файловая система)
### Phase 2 (Target Production)
* **Analytics**: **ClickHouse**. Для хранения логов каждого хода (Time-Series) и ML-обучения.
* **Broker**: **RabbitMQ / Kafka**. Для связи с внешними микросервисами (Внешняя торговля, Auth).
* **Metrics**: Prometheus + Grafana.
## 2. Принципы проектирования (Clean Architecture)
Чтобы легко перейти от Phase 1 к Phase 2, жестко соблюдаем слои:
1. **Domain Layer (Core)**: *Чистый Python.*
* Бизнес-правила (Entity, Value Objects).
* Никаких зависимостей от внешних библиотек.
2. **Application Layer (Services)**: *Оркестрация.*
* Use Cases ("Сделать ход", "Создать игру").
* Работает с интерфейсами (`IEventBus`, `IRepository`), а не конкретными БД.
3. **Infrastructure Layer (Adapters)**: *Грязная реализация.*
* Здесь лежат драйверы Redis, ClickHouse, RabbitMQ.
* Именно этот слой мы будем менять при масштабировании.
## 3. Компоненты системы
### 4.1. API Gateway (FastAPI)
* Входная точка для клиентов.
* Конвертирует HTTP запросы в `Commands`.
### 4.2. Game Engine (Domain)
* **TimeSystem**: Абстракция времени.
* **EntityManager**: ECS-структура.
* **MarketCore**: Логика сведения ордеров.
### 4.3. Infrastructure Adapters
* **RedisGameRepository**: Реализация `IGameRepository`.
* **RedisEventBus**: Реализация `IEventBus` (в Phase 2 заменим на `KafkaEventBus`).
* **FileAnalyticsRepository**: Реализация `IAnalyticsRepository` (в Phase 2 заменим на `ClickhouseRepository`).
## 5. Поток данных (Data Flow)
1. **Action**: Клиент шлет `POST /action`.
2. **Bus**: API кладет команду в `IEventBus` (Redis).
3. **Worker**:
* Поднимает состояние из `IGameRepository`.
* Применяет логику Домена.
* Генерирует события (`FoodEaten`, `ItemCrafted`).
4. **Analytics**: События асинхронно пишутся в `IAnalyticsRepository` (ClickHouse/Files).
## 6. Структура проекта
```text
/app
/domain # ЧИСТАЯ ЛОГИКА
/entities # Agent, Resource
/interfaces # Абстракции: IGameRepository, IEventBus, IAnalytics
/events # Domain Events
/application # СЦЕНАРИИ
/commands # DTO
/use_cases # GameLoopService
/infrastructure # РЕАЛИЗАЦИЯ
/redis # RedisRepo, RedisBus
/clickhouse # (Заготовка) ClickhouseAnalytics
/fs # FileAnalytics
/web # API
/api # Routes
main.py # Dependency Injection Container
```