> Как спроектировать систему url shortener на уровне микросервисов (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Black Wall Group (BWG)

Стек: Go

> Пример ответа

При проектировании URL Shortener на микросервисах в Go ключевые аспекты - это генерация коротких ссылок, их хранение, редиректы и аналитика. Разобьем систему на следующие микросервисы:

  1. API Gateway - единая точка входа на Go (например, с использованием gin или chi). Принимает запросы, маршрутизирует, валидирует, ограничивает частоту (rate limiting).

  2. Service for Shortening - отвечает за генерацию уникального короткого кода (base62 из 7 символов, ~3.5 трлн комбинаций). Использует распределенный счетчик (например, Redis INCR) или snowflake-подобный ID, затем кодирует. Хранит связку short -> long URL в базе данных.

  3. Service for Redirection - обрабатывает GET-запросы по короткому пути. Кэширует популярные ссылки в Redis (TTL, LRU). При промахе - читает из постоянного хранилища (PostgreSQL или Cassandra для горизонтального масштабирования). Возвращает HTTP 301/302.

  4. Service for Analytics - асинхронно собирает статистику: IP, user-agent, время, гео. Использует очередь сообщений (Kafka/NATS) для разгрузки редиректа. Данные агрегируются в ClickHouse или TimescaleDB.

  5. Database layer - для постоянного хранения используем шардированную БД (по хешу короткого кода). Для кэша - Redis Cluster.

Коммуникация: синхронная через gRPC (быстрее, строгая типизация) между сервисами, асинхронная через брокер для аналитики.

Пример кода на Go для генерации короткого кода:

GO
package main
import (
"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 для хранения.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью