Skip to content

fastrapier/swe-proj

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 

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

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors