mnemo_cards/plans/микросервисная_архитектура.md
Dmitry 8d3d4cd1f7
Some checks are pending
Backend CI / test (push) Waiting to run
Backend CI / build (push) Blocked by required conditions
Mobile App CI / test (push) Waiting to run
Mobile App CI / build-android (push) Blocked by required conditions
Mobile App CI / build-ios (push) Blocked by required conditions
Web App CI / test (push) Waiting to run
Web App CI / build (push) Blocked by required conditions
Deploy Mnemo Cards / Deploy Backend (push) Waiting to run
Deploy Mnemo Cards / Deploy Web App (push) Blocked by required conditions
Deploy Mnemo Cards / Final Verification (push) Blocked by required conditions
Deploy Telegram Bot / Deploy Telegram Bot (push) Waiting to run
stuff
2025-12-20 02:38:51 +03:00

543 lines
No EOL
19 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.

---
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 для каждого сервиса