Перейти к содержанию

Системный дизайн — основы для junior+/middle

На собесе уровня middle часто просят накидать архитектуру простого сервиса (URL shortener, чат, лента, корзина). Универсальный каркас ответа:

  1. API — REST или gRPC. Контракт. Идемпотентность критичных эндпоинтов.
  2. Хранилище — что в БД, что в кэше, что в очереди.
  3. Масштабируемость — как шардировать, как балансировать.
  4. Гарантии — at-least-once / exactly-once-ish, retry с backoff.
  5. 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'ы.