mnemo_cards/plans/микросервисная_архитектура.md

543 lines
19 KiB
Markdown
Raw Permalink Normal View History

2025-12-19 23:38:51 +00:00
---
name: Микросервисная архитектура Mnemo Cards
overview: План разделения монолитного backend на микросервисы с учетом независимого деплоя, разных технологий и организации команды. Используется гибридный подход к базам данных.
todos:
- id: analyze_dependencies
content: Проанализировать зависимости между модулями и создать карту зависимостей
status: pending
- id: design_api_gateway
content: Спроектировать API Gateway для маршрутизации запросов к микросервисам
status: pending
- id: create_shared_jwt_lib
content: Создать shared библиотеку для валидации JWT токенов
status: pending
- id: plan_database_migration
content: Спланировать миграцию базы данных (схемы/отдельные БД)
status: pending
- id: extract_auth_service
content: Выделить Auth Service как первый микросервис
status: pending
- id: extract_payment_service
content: Выделить Payment Service как второй микросервис
status: pending
- id: setup_service_communication
content: Настроить коммуникацию между сервисами (синхронная/асинхронная)
status: pending
- id: setup_monitoring
content: Настроить мониторинг и логирование для микросервисов
status: pending
- id: create_docker_compose
content: Создать docker-compose для локальной разработки всех микросервисов
status: pending
---
# План разделения на микросервисы
## Анализ текущей архитектуры
Текущий монолит включает следующие доменные области:
1. **Authentication & User Management** - JWT, Telegram auth, пользователи
2. **Content Management** - Packs, Cards, Tests, Games
3. **Payments & Subscriptions** - YooKassa, Google Play, RuStore
4. **Statistics & Analytics** - User statistics, achievements, word statistics
5. **Admin Panel** - Админские функции
6. **Telegram Bot** - Бот для авторизации
7. **Cron Jobs & Background Tasks** - Фоновые задачи
## Предлагаемое разделение на микросервисы
### 1. **Auth Service** (Сервис аутентификации)
**Ответственность:**
- JWT токены (access/refresh)
- Регистрация/логин пользователей
- Telegram авторизация (генерация кодов)
- Управление пользователями (CRUD)
- ACL и авторизация
**База данных:**
- `users`, `auth`, `tokens`, `refresh_tokens`, `telegram_auth_codes`
**API Endpoints:**
- `/api/v2/auth/*` (register, login, refresh, logout, telegram)
- `/api/v2/users/*` (CRUD пользователей)
**Зависимости:**
- PostgreSQL (собственная схема)
- Telegram Bot API (для авторизации)
**Технологии:**
- Dart + Shelf (можно оставить или перейти на Go/Node.js)
**Особенности:**
- Критический сервис - должен быть высокодоступным
- Низкая задержка критична для всех запросов
---
### 2. **Content Service** (Сервис контента)
**Ответственность:**
- Управление паками карточек (CardPacks)
- Управление карточками (GameCards)
- Управление тестами (Tests)
- Управление играми (Games assets)
- Голоса карточек (CardVoices)
- Доступ к контенту (проверка прав доступа через Auth Service)
**База данных:**
- `card_packs`, `game_cards`, `card_pack_cards`, `card_voices`, `tests`, `tasks`
**API Endpoints:**
- `/api/v2/packs/*`
- `/api/v2/tests/*`
- `/api/v2/games/*`
- `/api/v2/voice/*`
**Зависимости:**
- PostgreSQL (собственная схема или shared с Payments для связей)
- Auth Service (проверка доступа через API или shared token validation)
**Технологии:**
- Dart + Shelf (можно перейти на Python/FastAPI для удобства работы с контентом)
**Особенности:**
- Статические файлы (изображения, аудио) - можно вынести в CDN/Storage
- Высокая нагрузка на чтение
---
### 3. **Payment Service** (Сервис платежей)
**Ответственность:**
- Обработка платежей через YooKassa
- Обработка IAP (Google Play, RuStore)
- Управление промокодами
- Управление скидками (discounts)
- Покупка паков
- Webhooks от платежных систем
**База данных:**
- `payments`, `promo_codes`, `discounts`, `subscriptions` (или отдельный сервис)
**API Endpoints:**
- `/api/v2/purchases/*`
- `/api/v2/promocodes/*`
- `/api/v2/discounts/*`
- `/api/webhooks/yookassa`, `/api/webhooks/google-play`, `/api/webhooks/rustore`
**Зависимости:**
- PostgreSQL (собственная схема)
- Auth Service (проверка пользователя)
- Content Service (информация о паках для покупки)
- YooKassa API, Google Play API, RuStore API
**Технологии:**
- Dart + Shelf или Node.js/TypeScript (удобная работа с webhooks)
**Особенности:**
- Высокие требования к безопасности
- Идемпотентность операций
- Обработка webhooks
---
### 4. **Subscription Service** (Сервис подписок)
**Ответственность:**
- Управление подписками пользователей
- Проверка активности подписки
- Фичи подписки
- Автопродление (через cron)
**База данных:**
- `subscriptions` (может быть shared с Payment Service на этапе миграции)
**API Endpoints:**
- `/api/v2/subscriptions/*`
**Зависимости:**
- PostgreSQL (собственная схема или shared с Payment)
- Auth Service (проверка пользователя)
- Payment Service (создание подписки через платеж)
**Технологии:**
- Dart + Shelf или отдельный микросервис
**Вариант:** Можно объединить с Payment Service на первом этапе, если логика тесно связана.
---
### 5. **Statistics Service** (Сервис статистики)
**Ответственность:**
- Статистика пользователей (user statistics)
- Статистика по словам (word statistics)
- Достижения (achievements)
- Сессии обучения (study sessions)
- Аналитика и отчеты
**База данных:**
- `user_datas`, `word_statistics`, `achievements`, `study_sessions`, `pack_progress`
**API Endpoints:**
- `/api/v2/users/me/statistics/*`
- `/api/v2/users/me/achievements`
- `/api/v2/users/me/sessions`
**Зависимости:**
- PostgreSQL (собственная схема или отдельная БД для аналитики - TimescaleDB/ClickHouse)
- Auth Service (проверка пользователя)
- Content Service (информация о паках/карточках)
**Технологии:**
- Dart + Shelf или Python (удобно для аналитики) или Go (высокая производительность)
**Особенности:**
- Высокая нагрузка на запись (tracking событий)
- Возможность использовать TimescaleDB для временных рядов
- Отложенная обработка данных (бэтчинг)
---
### 6. **Admin Service** (Админ панель)
**Ответственность:**
- Админская авторизация
- Управление контентом (CRUD паков, карточек)
- Аналитика для админов
- Управление пользователями
- Audit логирование
**База данных:**
- `audit` (отдельная таблица для логирования действий)
- Использует данные из других сервисов
**API Endpoints:**
- `/api/v2/admin/*`
**Зависимости:**
- Auth Service (проверка админ прав)
- Content Service (управление контентом)
- Payment Service (управление платежами)
- Statistics Service (аналитика)
**Технологии:**
- Dart + Shelf (можно оставить текущий стек)
**Особенности:**
- Агрегирует данные из нескольких сервисов
- Требует высоких прав доступа
---
### 7. **Telegram Bot Service** (Сервис Telegram бота)
**Ответственность:**
- Обработка команд Telegram бота
- Генерация кодов авторизации для веба
- Интеграция с Auth Service
**База данных:**
- Может использовать shared `telegram_auth_codes` или собственную
**API Endpoints:**
- `/api/v2/telegram-bot/*`
- Telegram Bot API webhook
**Зависимости:**
- Auth Service (создание/проверка кодов)
- Telegram Bot API
**Технологии:**
- Dart + Shelf или Node.js/TypeScript (удобные библиотеки для Telegram)
**Особенности:**
- Относительно изолированный сервис
- Может работать независимо
---
### 8. **Background Jobs Service** (Сервис фоновых задач)
**Ответственность:**
- Cron задачи (backup, проверка платежей, генерация промокодов, etc.)
- Асинхронная обработка задач
- Очереди задач (опционально)
**Зависимости:**
- Все остальные сервисы (для выполнения задач)
**Технологии:**
- Dart (текущий стек) или перейти на специализированное решение (Bull/BullMQ на Node.js, Celery на Python)
**Альтернатива:** Можно интегрировать в каждый сервис отдельно или использовать общий Job Queue (Redis + Worker).
---
## Стратегия миграции
### Фаза 1: Подготовка (1-2 недели)
1. **Выделить общие компоненты:**
- Общие DTO/models в `mnemo_cards_common`
- Shared database connection pool
- API Gateway (опционально, можно использовать nginx/kong)
2. **Создать API Gateway:**
- Единая точка входа для клиентов
- Маршрутизация к микросервисам
- Агрегация запросов (если нужно)
- Rate limiting, CORS
### Фаза 2: Выделение критических сервисов (2-4 недели)
**Приоритет 1: Auth Service**
- Выделить аутентификацию в отдельный сервис
- Создать JWT validation library для других сервисов
- Мигрировать пользователей
**Приоритет 2: Payment Service**
- Выделить платежи
- Изолировать webhooks
- Мигрировать платежные данные
### Фаза 3: Выделение остальных сервисов (4-8 недель)
**Приоритет 3: Content Service**
- Выделить управление контентом
- Вынести статические файлы в CDN/Storage
**Приоритет 4: Statistics Service**
- Выделить статистику
- Оптимизировать запись данных (бэтчинг)
**Приоритет 5: Остальные сервисы**
- Admin Service
- Telegram Bot Service
- Background Jobs Service
### Фаза 4: Оптимизация (ongoing)
- Разделение баз данных (Database per Service)
- Кэширование (Redis)
- Message Queue для асинхронной коммуникации
- Мониторинг и логирование (ELK, Prometheus)
---
## Схема коммуникации между сервисами
```mermaid
graph TB
Client[Web Client] --> Gateway[API Gateway]
Gateway --> AuthService[Auth Service]
Gateway --> ContentService[Content Service]
Gateway --> PaymentService[Payment Service]
Gateway --> SubscriptionService[Subscription Service]
Gateway --> StatisticsService[Statistics Service]
Gateway --> AdminService[Admin Service]
TelegramBot[Telegram Bot] --> AuthService
TelegramBot --> Gateway
PaymentService --> AuthService
PaymentService --> ContentService
SubscriptionService --> AuthService
SubscriptionService --> PaymentService
StatisticsService --> AuthService
StatisticsService --> ContentService
AdminService --> AuthService
AdminService --> ContentService
AdminService --> PaymentService
AdminService --> StatisticsService
BackgroundJobs[Background Jobs] --> AuthService
BackgroundJobs --> PaymentService
BackgroundJobs --> StatisticsService
AuthService --> AuthDB[(Auth DB)]
ContentService --> ContentDB[(Content DB)]
PaymentService --> PaymentDB[(Payment DB)]
SubscriptionService --> SubscriptionDB[(Subscription DB)]
StatisticsService --> StatisticsDB[(Statistics DB)]
```
---
## Рекомендации по базам данных (гибридный подход)
### Вариант 1: Shared Database на первом этапе
- Все сервисы используют одну БД, но разные схемы (namespaces)
- Упрощает миграцию
- Позволяет постепенно разделять
### Вариант 2: Database per Service (целевое состояние)
**Auth Service:**
- `auth_db` - users, tokens, refresh_tokens, telegram_auth_codes
**Content Service:**
- `content_db` - card_packs, game_cards, card_voices, tests, tasks
**Payment Service:**
- `payment_db` - payments, promo_codes, discounts
**Subscription Service:**
- `subscription_db` - subscriptions
**Statistics Service:**
- `statistics_db` - user_datas, word_statistics, achievements, study_sessions
- Или TimescaleDB для временных рядов
### Переходные связи:
Для связей между сервисами использовать:
- **API calls** - синхронная коммуникация (для проверки доступа, получения данных)
- **Event-driven** - асинхронная коммуникация (опционально, через message queue)
- **Shared IDs** - использование UUID для связи между сервисами
---
## Технологические рекомендации
### API Gateway
- **Kong** или **nginx** - для маршрутизации
- Или **Istio** для более сложных сценариев
### Service Mesh (опционально)
- **Istio** или **Linkerd** - для управления трафиком, безопасности, observability
### Message Queue (для асинхронной коммуникации)
- **Redis Pub/Sub** или **RabbitMQ** или **NATS**
- Для событий: payment_completed, user_registered, etc.
### Мониторинг
- **Prometheus + Grafana** - метрики
- **ELK Stack** (Elasticsearch, Logstash, Kibana) - логи
- **Jaeger** или **Zipkin** - distributed tracing
### Кэширование
- **Redis** - для кэширования токенов, контента, статистики
---
## Файлы, которые нужно будет изменить/создать
### Новые директории для микросервисов:
- `services/auth-service/`
- `services/content-service/`
- `services/payment-service/`
- `services/subscription-service/`
- `services/statistics-service/`
- `services/admin-service/`
- `services/telegram-bot-service/`
- `services/background-jobs-service/`
### Общие компоненты:
- `shared/jwt-validator/` - библиотека для валидации JWT
- `shared/database-migrations/` - миграции БД
- `shared/common-models/` - общие модели (уже есть в `mnemo_cards_common`)
### Конфигурация:
- `docker-compose.microservices.yml` - оркестрация всех сервисов
- `infrastructure/` - terraform/k8s конфигурации
---
## Критерии успешности разделения
1. ✅ Каждый сервис можно деплоить независимо
2. ✅ Сервисы могут использовать разные технологии
3. ✅ Отказ одного сервиса не ломает остальные
4. ✅ Легко масштабировать отдельные сервисы
5. ✅ Четкое разделение ответственности
6. ✅ Тестируемость каждого сервиса отдельно
---
## Риски и митигация
### Риск 1: Сложность отладки распределенной системы
**Митигация:** Использовать distributed tracing (Jaeger), централизованное логирование
### Риск 2: Сетевая задержка между сервисами
**Митигация:** Кэширование, асинхронная коммуникация где возможно, оптимизация API calls
### Риск 3: Консистентность данных между сервисами
**Митигация:** Event-driven архитектура, eventual consistency, saga pattern для транзакций
### Риск 4: Усложнение деплоя
**Митигация:** Docker Compose для разработки, Kubernetes для продакшена, CI/CD для каждого сервиса