Как спроектировать систему url shortener на уровне микросервисов
Что проверяют
Умеете ли вы резать систему на сервисы по реальным границам нагрузки и владения данными, а не по существительным из условия. Следом спрашивают, как сервисы общаются, что происходит при падении одного из них и оправдано ли дробление вообще.
Как отвечать
Честно скажите, что сокращателю ссылок микросервисы нужны только ради разной нагрузки на части системы или разных команд. Разумное деление:
- Redirect Service: самый горячий путь, только чтение. Отдельный деплой позволяет масштабировать его независимо, держать минимум зависимостей и локальный кеш;
- Link Service: создание, редактирование, срок жизни и владелец ссылки. Единственный, кто пишет в хранилище ссылок;
- генератор ID: отдельный сервис или библиотека, выдающая диапазоны номеров для Base62, чтобы инстансы не пересекались;
- Analytics Service: читает события кликов из Kafka и пишет в колоночное хранилище вроде ClickHouse. Его падение не должно влиять на редирект;
- API Gateway: TLS, аутентификация, rate limit, маршрутизация.
Связи: синхронно по gRPC там, где нужен ответ (создание ссылки), асинхронно через брокер там, где достаточно события (клики, инвалидация кеша). Каждый сервис владеет своими данными, общей базы нет. Redirect Service читает реплику или собственную копию, которую наполняет из событий LinkCreated.
Что показать в Go: context с дедлайнами на каждом межсервисном вызове, ретраи с джиттером только для идемпотентных операций, circuit breaker перед зависимостями, health-проверки для оркестратора и трассировку через OpenTelemetry, чтобы видеть путь запроса через все сервисы.
Где спотыкаются
Выделяют «Database Service» как отдельный микросервис. База это хранилище, а не сервис с бизнес-логикой, и прослойка перед ней только добавляет сетевой переход.
Ставят аналитику в синхронную цепочку редиректа. Любая задержка статистики сразу превращается в медленный переход по ссылке.
Не могут назвать цену дробления: согласованность данных между сервисами, инвалидация кешей, отладка запроса через несколько процессов. Сильный ответ содержит условие, при котором вы бы оставили монолит.