> Как спроектировать систему url shortener на уровне микросервисов (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Black Wall Group (BWG)
Стек: Go
> Пример ответа
При проектировании URL Shortener на микросервисах в Go ключевые аспекты - это генерация коротких ссылок, их хранение, редиректы и аналитика. Разобьем систему на следующие микросервисы:
-
API Gateway - единая точка входа на Go (например, с использованием
ginилиchi). Принимает запросы, маршрутизирует, валидирует, ограничивает частоту (rate limiting). -
Service for Shortening - отвечает за генерацию уникального короткого кода (base62 из 7 символов, ~3.5 трлн комбинаций). Использует распределенный счетчик (например, Redis INCR) или snowflake-подобный ID, затем кодирует. Хранит связку
short -> long URLв базе данных. -
Service for Redirection - обрабатывает GET-запросы по короткому пути. Кэширует популярные ссылки в Redis (TTL, LRU). При промахе - читает из постоянного хранилища (PostgreSQL или Cassandra для горизонтального масштабирования). Возвращает HTTP 301/302.
-
Service for Analytics - асинхронно собирает статистику: IP, user-agent, время, гео. Использует очередь сообщений (Kafka/NATS) для разгрузки редиректа. Данные агрегируются в ClickHouse или TimescaleDB.
-
Database layer - для постоянного хранения используем шардированную БД (по хешу короткого кода). Для кэша - Redis Cluster.
Коммуникация: синхронная через gRPC (быстрее, строгая типизация) между сервисами, асинхронная через брокер для аналитики.
Пример кода на Go для генерации короткого кода:
GOpackage mainimport ("crypto/rand""math/big")const alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"func GenerateShortCode(length int) (string, error) {code := make([]byte, length)for i := range code {idx, err := rand.Int(rand.Reader, big.NewInt(int64(len(alphabet))))if err != nil {return "", err}code[i] = alphabet[idx.Int64()]}return string(code), nil}
Масштабирование: каждый микросервис деплоится как отдельный Kubernetes pod с HPA по CPU/памяти. Для редиректов - CDN (Cloudflare) с кэшированием 301. Для предотвращения коллизий - проверка уникальности при вставке с повторной генерацией (до 3 попыток).
Итог: система состоит из 4 микросервисов, общается через gRPC и очередь, использует Redis для кэша и PostgreSQL/Cassandra для хранения.
> Похожие задачи по Go
Что нужно помнить при добавлении элементов в слайс Go без знания точного размера
Можно ли шарить данные между потоками
Как уведомить горутины в Go о необходимости завершения при получении первого результата
Используешь ли багтрекинговые системы
> Похожие задачи по backend
Что нужно помнить при добавлении элементов в слайс Go без знания точного размера
Можно ли шарить данные между потоками
Как уведомить горутины в Go о необходимости завершения при получении первого результата
Используешь ли багтрекинговые системы
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью