Шпаргалка: проєктування систем

Затримка, доступність, CAP, оцінки на серветку, LB, кеш, черги — для інтервʼю й реальних архітектур. Відкривайте з будь-якого уроку в змісті.

Затримка, пропускна здатність, доступність

  • Затримка vs пропускна здатність

    Затримка — час одного запиту (p50, p99). Пропускна здатність — скільки запитів/сек система тримає. Високий пропускна здатність не гарантує низький p99.

    L=λWL = \lambda W

    Little's Law: середня кількість у системі = arrival частота × середній час. Черга росте, коли навантаження наближається до capacity.

  • Доступність (nines)

    Частка часу безвідмовної роботи за рік. Кожна «девʼятка» — на порядок менше простою.

    99%≈3.65 дн/рік;99.9%≈8.76 год/рік;99.99%≈52.6 хв/рік99\% \approx 3.65\ \text{дн/рік};\quad 99.9\% \approx 8.76\ \text{год/рік};\quad 99.99\% \approx 52.6\ \text{хв/рік}
  • SLI, SLO, SLA

    SLI — вимір (затримка p99). SLO — ціль (p99 < 200 ms). SLA — контракт з наслідками (кредити), якщо SLO порушено.

  • Horizontal vs vertical scale

    Vertical — більший CPU/RAM на одній машині (стеля). Horizontal — більше вузлів + балансувальник навантаження (складніше, але далі масштабується).

CAP і узгодженість

  • CAP (спрощено)

    При network розділ (P) розподілена система обирає між Узгодженість (усі бачать одне) і Доступність (кожен запит відповідає). На практиці — спектр моделей, не binary C vs A.

  • Сувора vs кінцева узгодженість

    Сувора — читання бачить останній запис (linearizable). Кінцева — репліки зійдуться з часом; нижча затримка, вища пропускна здатність запису.

    Read-your-writes, causal — проміжні гарантії для UX без повної суворої узгодженості.

  • ACID vs BASE

    ACID — транзакції SQL (Atomicity, Узгодженість, Isolation, Durability). BASE — Basically Available, Soft state, кінцева узгодженість — типово NoSQL під навантаженням.

  • Ідемпотентність

    Повторний запит дає той самий ефект — критично для повтори, черги, payment. Ідемпотентність ключ у API.

Estimation (napkin math)

  • QPS і сховище

    DAU × actions/day ÷ 86400 ≈ avg QPS; peak ≈ 2–10× avg. Сховище = records × size × зберігання × реплікація factor.

    QPSavg≈DAU×reads+writes/day86400\text{QPS}_{\text{avg}} \approx \frac{\text{DAU} \times \text{reads+writes/day}}{86400}
  • Затримка budget

    Розкладіть p99 end-to-end: DNS, TLS, LB, app, DB, кеш. Якщо sum(parts) > SLO — оптимізуйте найповільніший hop.

    1 ms same-DC RTT; cross-region — десятки–сотні ms. Serial calls додаються; parallel — max.

  • Пропускна здатність диска/мережі

    SSD ~ сотні MB/s–GB/s; HDD ~ сотні MB/s sequential. 1 Gbps ≈ 125 MB/s теоретично. Вузьке місце часто DB або N+1 queries, не «CPU на папері».

DNS, балансувальник навантаження, CDN

  • DNS у архітектурі

    Резолв імені → IP; TTL кешує зміни. Geo DNS / weighted routing — трафік на регіони. Health checks оновлюють записи.

  • Балансувальник навантаження

    Розподіл трафіку між instances: round-robin, least connections, consistent хеш (sticky по ключ). L4 (TCP) vs L7 (HTTP path/host).

    Active перевірки здоровʼя; drain node перед розгортанням. Сесія stickiness — cookie або хеш, компроміс з відмовою з перемиканням (failover).

  • CDN

    Край кешує static (JS, images, video). Користувач ближче до PoP — нижча затримка. Походження — ваш сервер при промах кешу.

    Кеш-Control, ETag; інвалідація через purge API або короткий TTL для dynamic-ish content.

  • Reverse proxy

    Nginx/Envoy перед app: TLS termination, обмеження частоти, routing, compression — один вхід для клієнта.

SQL, NoSQL, реплікація, шардування

  • SQL vs NoSQL (коли що)

    SQL — joins, транзакції, чітка схема (orders + користувачі). NoSQL — document/KV/wide-column/graph під massive scale, flexible schema, простіший доступ патерн.

  • Реплікація

    Лідер-послідовник: writes на лідер, reads з репліки (lag!). Multi-лідер — конфлікти; leaderless — quorum читання/запис (Dynamo-style).

    Синхронна реплікація — сильніша durability, вища затримка запису. Асинхронна — швидше, ризик втрати останніх writes при failover.

  • Шардування (partitioning)

    Горизонтальний поділ даних: хеш(user_id) mod N, range (user_id 0–1M), geo. Rebalance при додаванні шард — consistent hashing зменшує переміщення.

    Cross-шард joins/transactions — дорогі; проектуйте доступ патерн навколо шард ключ.

  • Індекс і N+1

    Індекс прискорює читання, сповільнює запис. N+1 — цикл запитів замість одного join/batch; типова причина повільного API.

Кеш: TTL і інвалідація

  • Кеш-aside

    App: читання кеш → промах → DB → запис кеш. Простий патерн; app відповідає за узгодженість з DB.

    TTL — автоматичне застаріння. Кеш stampede — багато промах одночасно; рішення: singleflight, jitter TTL.

  • Write-through / відкладений запис

    Write-through — запис у кеш і DB разом (узгодженість). Write-back — спочатку кеш, асинхронний flush (швидше, ризик втрати).

  • Invalidation

    Delete/update кеш при зміні DB — інакше stale reads. Version ключ у кеш entry; pub/sub для multi-instance інвалідація.

  • Redis use cases

    In-memory: сесія, обмеження частоти, leaderboard, pub/sub, розподілений lock (обережно з TTL і fencing token). Не заміна primary DB без persistence план.

Queues і асинхронний

  • Повідомлення черга

    Decouple producer/consumer: spikes поглинає черга, воркер обробляє в своєму темпі. At-least-once delivery — consumer ідемпотентний.

    Kafka — log, replay, high пропускна здатність; RabbitMQ/SQS — classic черга; dead-letter черга для failed повідомлення.

  • Зворотний тиск (backpressure)

    Коли consumer повільний — не завалювати памʼять; блок/slow producer, max розмір черги, 429 на API.

  • Асинхронний робочий процес

    HTTP 202 + задача id + опитування/webhook для довгих задач (video encode, export). Клієnt не тримає connection хвилини.

  • Event-driven

    Події (order.created) → кілька subscribers: email, analytics, inventory. Loose coupling; потрібна ordering гарантія лише де треба.

Стійкість до збоїв

  • Резервування і радіус ураження

    N+1, multi-AZ, multi-region — failure одного вузла не валить сервіс. Blast radius — скільки користувачів/функцій зачепить один incident.

  • Timeouts, повтори, автоматичний вимикач

    Timeout — не чекати вічно. Retry з exponential backoff + jitter на transient errors. Circuit breaker — при серії fail швидко fail open, дати upstream відновитись.

    Retry лише для ідемпотентних ops або з ключем ідемпотентності; інакше дубльовані побічні ефекти.

  • Graceful degradation

    Вимкнути recommendations, лишити checkout. Прапорці функцій; static fallback коли dependency down.

  • Disaster recovery

    RPO — скільки даних можна втратити (backup interval). RTO — скільки часу на відновлення. Regular restore drills, не лише backup.

← До програми курсу