Backend механики плейлистов для стримингового сервиса музыки. Три микросервиса на Go, взаимодействующих через Kafka.
Проектирование и реализация backend-системы, которая поддерживает:
- CRUD плейлистов с добавлением/удалением треков
- Перемешивание и воспроизведение в случайном порядке
- Синхронизацию воспроизведения между устройствами (отставание до 10 секунд)
- Масштабирование от 100K до 50M DAU
Полное описание задачи: TASK.MD
┌──────────────┐
│ Клиенты │
└──────┬───────┘
│ HTTP REST
┌──────────────┼──────────────┐
▼ ▼ ▼
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
│Track Service│ │Playlist Svc │ │Playback Svc │
│ (каталог) │ │ (плейлисты) │ │(воспроизвед.)│
└──────┬──────┘ └───┬──────┬───┘ └───┬──────┬───┘
│ │ │ │ │
│ PostgreSQL │ PostgreSQL │ Redis + PG
│ │ │ │ │
└──────┬─────┘ └────┬────┘ │
│ │ │
▼ ▼ │
┌─────────────────────────┐ │
│ Kafka │◄───────┘
└─────────────────────────┘
- Track Service -- каталог треков (метаданные). PostgreSQL.
- Playlist Service -- CRUD плейлистов. PostgreSQL. Денормализованные метаданные треков.
- Playback Service -- очередь, shuffle, состояние воспроизведения. Redis + PostgreSQL.
Межсервисное взаимодействие -- только через Kafka (асинхронные события, денормализация данных). Синхронных вызовов между сервисами нет.
├── template/ # Go-шаблон для создания сервисов
│ ├── README.md # Документация шаблона (компоненты, расширение, конфигурация)
│ ├── cmd/service/ # Точка входа
│ ├── internal/ # Пакеты сервиса
│ │ ├── config/ # Конфигурация (Viper: YAML + env)
│ │ ├── server/ # HTTP-сервер (fasthttp)
│ │ ├── handler/ # Обработчики запросов
│ │ ├── middleware/ # Recoverer, RequestID, Tracing, Metrics, Logger
│ │ ├── apperror/ # Типизированные ошибки API
│ │ ├── validator/ # Валидация JSON-запросов
│ │ ├── logger/ # Структурированный JSON-логгер (slog)
│ │ ├── tracing/ # OpenTelemetry (OTLP/gRPC)
│ │ ├── postgres/ # pgxpool + миграции
│ │ ├── redis/ # go-redis + OTel
│ │ └── kafka/ # Producer, Consumer, Event envelope
│ ├── configs/ # YAML-конфиги + observability-стек
│ ├── migrations/ # SQL-миграции
│ ├── docker-compose.yml # Сервис + PG + Redis + Kafka + Jaeger + Prometheus + Grafana + Loki
│ ├── Dockerfile # Multi-stage, non-root
│ └── Makefile # build, test, lint, docker, migrate
│
├── docs/adr/ # Architecture Decision Records
│ ├── 001-service-decomposition-and-storage.md
│ ├── 002-kafka-inter-service-communication.md
│ ├── 003-playback-sync-and-queue.md
│ └── 004-caching-strategy.md
│
├── .github/workflows/ # Переиспользуемые CI workflows
│ ├── go-lint.yml # golangci-lint
│ ├── go-test.yml # go test -race + coverage
│ └── docker-build-push.yml # Docker build + push в GHCR
│
└── TASK.MD # Описание задачи
| Документ | Описание |
|---|---|
| template/README.md | Документация шаблона: компоненты, как расширять, конфигурация, Makefile |
| ADR-001: Декомпозиция и хранилища | Три сервиса, PostgreSQL + Redis, обоснование |
| ADR-002: Kafka | Асинхронное взаимодействие, денормализация, формат событий |
| ADR-003: Воспроизведение | Heartbeat-синхронизация, Fisher-Yates shuffle, персистентность очереди |
| ADR-004: Кеширование | Redis L1 + PostgreSQL L2, инвалидация через Kafka, thundering herd |
| TASK.MD | Полное описание задачи и требований |
cd template/
# Поднять инфраструктуру (PostgreSQL, Redis, Kafka)
make docker-up-infra
# Запустить сервис
make run
# Тесты
make test
# Всё вместе (сервис + инфра + Jaeger + Prometheus + Grafana + Loki)
make docker-up-all| Компонент | Технология |
|---|---|
| Язык | Go 1.26 |
| HTTP-сервер | fasthttp |
| DI | uber/fx |
| Конфигурация | Viper |
| БД | PostgreSQL 17 (pgxpool) |
| Кеш | Redis 7 (go-redis/v9) |
| Очередь | Kafka 3.9 (segmentio/kafka-go) |
| Трейсинг | OpenTelemetry + Jaeger |
| Метрики | Prometheus + Grafana |
| Логи | slog (JSON) + Loki + Promtail |
| Миграции | golang-migrate |
| Линтер | golangci-lint (22 правила) |
| CI | GitHub Actions (reusable workflows) |