Словарь терминологии System Design — 45 терминов System Design
Единая точка входа, маршрутизирующая запросы к микросервисам.
Reverse proxy перед сервисами. Маршрутизация, аутентификация, rate limiting, SSL termination, request aggregation.
Распределяет входящий трафик между серверами.
Алгоритмы: Round Robin, Least Connections, IP Hash, Weighted. L4 (TCP) vs L7 (HTTP). Health checks отключают нездоровые ноды.
Ограничение количества запросов для защиты от перегрузки.
Алгоритмы: Token Bucket (burst), Leaky Bucket (constant rate), Sliding Window. Реализуется на уровне Gateway или middleware.
Паттерн предотвращающий каскадные сбои.
Три состояния: CLOSED (норма), OPEN (fail fast), HALF-OPEN (тест). При превышении порога ошибок — разрывает цепь.
Хранение часто запрашиваемых данных в быстром хранилище.
Стратегии: Cache-Aside, Write-Through, Write-Behind. Инвалидация: TTL, event-driven, versioning. Cache stampede — главная опасность.
Компактный токен для передачи claims между сторонами.
Self-contained: header.payload.signature. Stateless аутентификация. Подпись HMAC или RSA. Нельзя отозвать до истечения — short-lived + refresh.
Асинхронная коммуникация через очередь сообщений.
Decouples producer/consumer. Гарантирует доставку. Point-to-Point vs Pub/Sub. Dead Letter Queue для необработанных.
Горизонтальное разделение данных между несколькими БД.
Hash-based (consistent hashing), Range-based, Directory-based. Решает предел одного сервера. Сложности: cross-shard queries, rebalancing.
Количество запросов в секунду — ключевая метрика нагрузки.
Определяет мощность системы. 100 RPS — маленький сервис, 10K — средний, 100K+ — high-load. Зависит от CPU, IO, network. Peak RPS обычно 3-5x от average.
Количество уникальных пользователей в день.
Ключевая бизнес-метрика. Из DAU рассчитывают RPS: DAU × действий/user / 86400. Peak factor 2-5x. MAU/DAU ratio показывает engagement (30%+ = хорошо).
Гарантия доступности сервиса в процентах.
99.9% = 8.7 часов downtime/год. 99.99% = 52 мин/год. 99.999% = 5 мин/год. SLO — цель, SLI — измерение, SLA — контракт. Error budget = 100% - SLO.
Время от отправки запроса до получения ответа.
Измеряется в percentiles: p50 (медиана), p95, p99. p99 < 100ms — быстрый сервис. Источники: network, serialization, processing, DB query. Tail latency (p99.9) часто в 10x от p50.
Количество операций, обрабатываемых за единицу времени.
RPS для API, QPS для БД, MB/s для сети. Throughput × Latency = Concurrency (Little's Law). Bottleneck определяет max throughput всей системы.
Сеть серверов для кэширования контента ближе к пользователю.
PoP (Point of Presence) по всему миру. Push CDN (загружаешь сам) vs Pull CDN (кэширует при первом запросе). Cache invalidation — основная сложность.
Преобразует доменное имя в IP-адрес.
Цепочка: browser cache → OS → recursive resolver → root → TLD → authoritative. TTL определяет кэширование. GeoDNS для multi-region routing.
TCP — надёжная доставка, UDP — быстрая без гарантий.
TCP: 3-way handshake, ordering, retransmission, flow control. UDP: нет соединения, нет гарантий, минимальный overhead. TCP для HTTP/DB, UDP для видео/игр/DNS.
Эволюция протокола: от текстового до мультиплексного.
HTTP/1.1: текстовый, одно соединение = один запрос. HTTP/2: бинарный, мультиплексинг, server push, header compression. HTTP/3: QUIC (UDP), 0-RTT, нет head-of-line blocking.
REST — текстовый JSON/HTTP, gRPC — бинарный Protobuf/HTTP2.
REST: простой, human-readable, широкая поддержка. gRPC: 10x компактнее, мультиплексинг, code-gen, streaming. REST для public API, gRPC для internal microservices.
Постоянное bidirectional соединение между клиентом и сервером.
Full-duplex после HTTP upgrade handshake. Низкий overhead (2 байта frame). Проблемы: sticky sessions за LB, reconnection logic, масштабирование через pub/sub.
В distributed системе можно гарантировать только 2 из 3: C, A, P.
Consistency — все читают одинаковые данные. Availability — каждый запрос получает ответ. Partition tolerance — система работает при network split. P обязателен → выбор CP или AP.
Гарантии транзакций: Atomicity, Consistency, Isolation, Durability.
Atomicity: всё или ничего. Consistency: валидные состояния. Isolation: параллельные транзакции не мешают (levels: Read Committed → Serializable). Durability: persist после commit (WAL).
Basically Available, Soft state, Eventually consistent.
Альтернатива ACID для distributed систем. Приоритет availability над consistency. Данные eventually сходятся. Подходит для social feeds, analytics, caching.
SQL — строгая схема + ACID. NoSQL — гибкая схема + горизонтальное масштабирование.
SQL: relational, joins, transactions. NoSQL типы: Document (MongoDB), Key-Value (Redis), Wide-Column (Cassandra), Graph (Neo4j). Polyglot persistence — используй оба.
Копирование данных между несколькими серверами БД.
Master-Slave: writes в master, reads из replicas. Master-Master: writes в любой (conflict resolution). Sync vs Async: consistency vs latency trade-off.
Структура данных для ускорения поиска в таблице.
B-tree: O(log N) поиск (default). Hash: O(1) equality. Composite: (a,b) для multi-column WHERE. Trade-off: быстрые reads, медленные writes + disk space.
Маппинг ключей на кольцо — при изменении серверов перемещается минимум данных.
Обычный hash%N перемещает всё при добавлении сервера. Consistent hashing: ключ → ближайший сервер по кольцу. Virtual nodes для равномерности. Используется в distributed cache и sharding.
Хранение всех событий вместо текущего состояния.
Append-only log событий. Состояние = replay всех events. Полный audit trail, temporal queries. Snapshots для оптимизации. Сложность: eventual consistency, storage growth.
Разделение моделей чтения и записи.
Command (write) и Query (read) — разные модели, разные БД. Write: нормализованная. Read: денормализованная (materialized views). Синхронизация через events.
Распределённая транзакция через цепочку локальных + компенсации.
Каждый сервис: локальная транзакция + событие. При ошибке — compensating transactions (откат). Choreography (events) vs Orchestration (coordinator). Idempotency обязательна.
Повторный вызов с теми же параметрами даёт тот же результат.
GET, PUT, DELETE — идемпотентны. POST — нет. Реализация: idempotency key в header, deduplication на сервере. Критично для retry logic и payment systems.
Данные станут согласованными через некоторое время.
Не мгновенная синхронизация, но гарантия сходимости. Подходит для read-heavy, global distribution. Проблемы: stale reads, conflict resolution (last-write-wins, vector clocks).
Масштабирование добавлением серверов (scale out).
Требует stateless сервисов. Shared-nothing архитектура. Auto-scaling по CPU/memory/queue depth. Практически безлимитно, но сложнее stateful компонентов.
Масштабирование увеличением мощности одного сервера (scale up).
Больше CPU/RAM/SSD. Просто, не требует изменения кода. Но: физический предел, SPOF, дорого на top-tier. Обычно для БД где sharding сложен.
Архитектура из независимых сервисов, общающихся через API.
Каждый сервис: свой codebase, своя БД, свой deploy. Плюсы: independent scaling, tech diversity, team autonomy. Минусы: network complexity, distributed transactions, observability.
Единое приложение с общей кодовой базой и БД.
Всё в одном deployable unit. Плюсы: простота, нет network overhead, ACID транзакции. Минусы: scaling всего целиком, long deploy cycles, tight coupling. Modular monolith — компромисс.
Инфраструктурный слой для управления коммуникацией между сервисами.
Sidecar proxy рядом с каждым сервисом. Обеспечивает: mTLS, retries, circuit breaking, observability, traffic splitting. Data plane (proxies) + Control plane (config).
Сервер-посредник перед backend, скрывающий его от клиента.
Функции: SSL termination, caching, compression, load balancing, security (WAF). Forward proxy — для клиента, reverse proxy — для сервера.
Протокол авторизации для делегированного доступа.
Flows: Authorization Code (+PKCE для SPA), Client Credentials (M2M), Device Code. Roles: Resource Owner, Client, Authorization Server, Resource Server. Implicit flow deprecated.
Алгоритм rate limiting с поддержкой burst.
Bucket заполняется токенами с постоянной скоростью. Запрос забирает токен. Если пустой — reject. Burst = размер bucket. Самый популярный алгоритм (AWS, Stripe, Cloudflare).
Загрузка данных только когда они реально нужны.
Не загружать всё заранее — подгружать по требованию. В БД: lazy fetch связанных сущностей. В UI: code splitting, dynamic import. В кэше: Cache-Aside = lazy loading.
Очередь для сообщений, которые не удалось обработать.
После N retry — сообщение уходит в DLQ. Мониторинг DLQ критичен (alert!). Reprocessing после fix. Без DLQ — poison message блокирует partition.
Механизм замедления producer при перегрузке consumer.
Если consumer не успевает — producer должен замедлиться, иначе OOM или потеря данных. Реализация: bounded queue, rate limiting, reactive streams (Flux/Mono).
Вероятностная структура данных: 'точно нет' или 'возможно да'.
Массив битов + несколько hash функций. False positive возможен, false negative — нет. Экономит memory vs HashSet. Используется для проверки существования перед дорогой операцией.
Выбор одного узла-лидера для координации в distributed системе.
Алгоритмы: Raft, Paxos, ZAB (ZooKeeper). Лидер принимает writes, followers реплицируют. При падении лидера — re-election. Split-brain — главная опасность.
Блокировка ресурса в distributed системе.
Один процесс владеет lock. SETNX + TTL в Redis (Redlock для multi-node). Проблемы: TTL слишком короткий (lock expires), network partition (split-brain). Fencing token для safety.