Системный дизайн — основы для junior+/middle¶
На собесе уровня middle часто просят накидать архитектуру простого сервиса (URL shortener, чат, лента, корзина). Универсальный каркас ответа:
- API — REST или gRPC. Контракт. Идемпотентность критичных эндпоинтов.
- Хранилище — что в БД, что в кэше, что в очереди.
- Масштабируемость — как шардировать, как балансировать.
- Гарантии — at-least-once / exactly-once-ish, retry с backoff.
- Observability — RED-метрики, логи, трейсинг.
Шаблон ответа на «спроектируй URL shortener»¶
1. API¶
POST /shorten { url } → { short_code }
GET /:code → 302 Redirect to original
GET /api/stats/:code → { hits, last_hit_at }
Идемпотентность: один и тот же URL → один и тот же short_code (хэш + БД).
2. Хранилище¶
- Postgres
links(id, short_code, url, created_at, hits)— основной. - Redis для cache hot-кодов:
code → url, TTL 5 минут. - При redirect: Redis hit → отдаём; miss → Postgres + populate Redis.
3. Масштабируемость¶
- Read-heavy → cache + read-replicas.
- Шардирование Postgres по
hash(short_code)если выходим за один инстанс. - Подсчёт hits — отложенно, через очередь (Kafka), агрегатор раз в минуту.
4. Гарантии¶
- POST /shorten — идемпотентный, повтор безопасен.
- Counter hits — at-least-once (могут немного завысить, не страшно).
- Если важна точность — exactly-once через Kafka transactional producer.
5. Observability¶
- RED: Rate (RPS), Errors (%), Duration (p99 latency).
- Логи с request_id.
- Трейсинг (Jaeger) для длинных запросов.
Reuse-карта компонентов¶
graph LR
LB[Load Balancer] --> API
API --> Cache[Redis cache]
API --> DB[(Postgres)]
API --> Q[Kafka events]
Q --> Worker[Aggregator]
Worker --> DB
DB --> Replicas[Read replicas]
Эта схема покрывает 80% типовых вопросов. Меняешь только сервисы и схему БД.
Чек-лист на собесе¶
- Уточнил ограничения: RPS, объём данных, latency, география.
- Нарисовал API (метод, путь, тело, ответ).
- Определил основной store (SQL/NoSQL/KV).
- Сказал про кэш и инвалидацию.
- Сказал про репликацию / шардирование.
- Упомянул очередь для async-операций.
- Сказал про метрики (RED) и трейсинг.
- Обсудил граничные случаи: расширение, отказы, дубликаты.
Что прокачать дальше¶
- 📖 «System Design Interview» Alex Xu (vol 1+2).
- 📖 Designing Data-Intensive Applications, Kleppmann.
- В работе — смотри как устроен ваш прод, разбирай incident'ы.