Skip to content
fastrapierPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

7 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Spotify Playlist Backend

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)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages