19 KiB
| name | overview | todos | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Микросервисная архитектура Mnemo Cards | План разделения монолитного backend на микросервисы с учетом независимого деплоя, разных технологий и организации команды. Используется гибридный подход к базам данных. |
|
План разделения на микросервисы
Анализ текущей архитектуры
Текущий монолит включает следующие доменные области:
- Authentication & User Management - JWT, Telegram auth, пользователи
- Content Management - Packs, Cards, Tests, Games
- Payments & Subscriptions - YooKassa, Google Play, RuStore
- Statistics & Analytics - User statistics, achievements, word statistics
- Admin Panel - Админские функции
- Telegram Bot - Бот для авторизации
- 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 недели)
-
Выделить общие компоненты:
- Общие DTO/models в
mnemo_cards_common - Shared database connection pool
- API Gateway (опционально, можно использовать nginx/kong)
- Общие DTO/models в
-
Создать 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)
Схема коммуникации между сервисами
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/- библиотека для валидации JWTshared/database-migrations/- миграции БДshared/common-models/- общие модели (уже есть вmnemo_cards_common)
Конфигурация:
docker-compose.microservices.yml- оркестрация всех сервисовinfrastructure/- terraform/k8s конфигурации
Критерии успешности разделения
- ✅ Каждый сервис можно деплоить независимо
- ✅ Сервисы могут использовать разные технологии
- ✅ Отказ одного сервиса не ломает остальные
- ✅ Легко масштабировать отдельные сервисы
- ✅ Четкое разделение ответственности
- ✅ Тестируемость каждого сервиса отдельно
Риски и митигация
Риск 1: Сложность отладки распределенной системы
Митигация: Использовать distributed tracing (Jaeger), централизованное логирование
Риск 2: Сетевая задержка между сервисами
Митигация: Кэширование, асинхронная коммуникация где возможно, оптимизация API calls
Риск 3: Консистентность данных между сервисами
Митигация: Event-driven архитектура, eventual consistency, saga pattern для транзакций
Риск 4: Усложнение деплоя
Митигация: Docker Compose для разработки, Kubernetes для продакшена, CI/CD для каждого сервиса