Fantasy League Backend
Fantasy-футбол платформа. Пользователи собирают виртуальные команды из реальных игроков и зарабатывают очки по результатам настоящих матчей. Подсчёт очков в почти реальном времени, турниры, лиги.
Бизнес-задача
Fantasy-спорт платформа, где пользователи:
- Создают виртуальные команды из реальных футболистов
- Зарабатывают очки на основе реальных матчей (голы, ассисты, карточки)
- Участвуют в турнирах и соревнуются с другими игроками
- Создают приватные лиги с друзьями
Архитектура
┌─────────────────┐ ┌─────────────────┐
│ Frontend │──REST──▶│ Go Backend │◀──OAuth──▶ VK
│ │ │ (FastHTTP) │
└─────────────────┘ └────────┬────────┘
│
┌────────────────────────────┼────────────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ PostgreSQL │ │ GoalsFeed │ │ S3 │
│ (state) │ │ External API │ │ (images) │
└───────────────┘ └───────────────┘ └───────────────┘
Подсчёт очков
Интеграция с внешним футбольным API:
- Опрос с дельтой: каждые 5 минут, обрабатываются только изменившиеся матчи
- Идемпотентность: повторная обработка событий не дублирует очки
- Карточки игроков: автоматический пересчёт очков после каждого матча
- Три уровня рейтингов: глобальный / по турниру / по раунду
Система очков
Гибкие правила начисления:
- По позиции: разные правила для вратарей, защитников, полузащитников, нападающих
- По событиям: голы, ассисты, жёлтые/красные карточки, сыгранные минуты
- Множители: капитан (×2), вице-капитан (×1.5)
- Настройки турнира: кастомные правила для каждого турнира
Управление командой
- Драфт: выбор состава и формации перед турниром
- Состав по раундам: смена формации между раундами
- Трансферы: лимит трансферов и бюджет
- Формации: 4-3-3, 4-4-2, 3-5-2 и другие
Аутентификация
- Двухэтапная: Email/Password → OTP → токен сессии
- VK OAuth: авторизация через ВКонтакте
- 2FA: TOTP для дополнительной защиты
Фоновые задачи
Планировщик на горутинах с защитой от дублирования:
- PostgreSQL Advisory Locks: распределённые блокировки для горизонтального масштабирования
- Состояние турнира: автоматическая смена статусов по расписанию
- Популярность игроков: динамический расчёт на основе трансферов
Стек
Backend
Go 1.24
FastHTTP
pgx/v5 + pgxpool
go-playground/validator
Data
PostgreSQL
golang-migrate
AWS S3
Integrations
GoalsFeed API
VK OAuth
SMTP (gomail)
Observability
Elastic APM
Prometheus
Zap (structured logs)
Моя роль
- Архитектура backend с нуля: слоистая архитектура (handlers → services → repositories)
- Движок подсчёта очков с идемпотентной обработкой и дельта-обновлениями
- PostgreSQL Advisory Locks для распределённых фоновых задач
- Интеграция с внешним футбольным API и VK OAuth