System Design
Load balancers, caches, queues і регіони: зберіть систему, яка витримає навантаження
- Single server. Усе на одній машині — Запит і відповідь, RPS, затримка (latency), межа потужності одного server і single point of failure.
- Separate database. Дані на окремій машині — Чому stateless server простіше масштабувати і куди перенести дані.
- Load balancer. Навантаження ділиться порівну — Горизонтальне масштабування (horizontal scaling): кілька блоків «Server» за одним входом, health check і правило N+1.
- Cache. Швидкі відповіді з пам’яті — Cache-aside, hit rate і TTL: як зняти навантаження з database.
- CDN. Статика ближче до користувача — Статика й динаміка, edge locations і заголовки кешування: як віддавати зображення та скрипти ближче до користувача.
- Read replicas. Копії database для читання — Read replicas, replication lag, failover і чому весь запис і далі йде в primary.
- Queue. Важка робота йде у фон — Як винести повільну роботу із запиту: queue, workers, зростання queue, піки й доставка at-least-once.
- Rate limiter. Захист від перевантаження — Rate limiter перед load balancer: швидка відповідь 429 замість перевантаження, ліміти на клієнта, backpressure і retries без лавини.
- Sharding. Дані частинами — Як розділити дані між незалежними databases: shard key, hot shards, запити через усі shards і resharding.
- Failover. Система переживає поломку — SPOF, єдині точки відмови: другий load balancer, read replica, яка замінює database, health check, failover і різниця між availability та durability.
- Multi-region і CAP. Коли вимикається цілий регіон — Другий регіон для далеких користувачів і на випадок втрати дата-центру, асинхронна реплікація та вибір між consistency і availability.
- Search index і event bus. Пошук і події — Event bus доставляє кожну зміну в search index і в аналітику: publish/subscribe, lag subscriber і eventual consistency.
- URL shortener. Підсумковий проєкт — Спроєктуйте систему з нуля: вимоги, оцінки, API, а потім схема, яка тримає пік, переживає відмови й вкладається в бюджет.
- Public API. Ліміти й квоти — API для розробників із тарифами Free і Pro: ядро із запасом у межах бюджету, а коли ключ Free починає викачувати базу — вирішити, кого обмежити, а за кого заплатити.
- Flash sale. Квитки на концерт — Квитки на концерт розходяться за хвилини: waiting room пускає стільки фанатів, скільки витримає hot row, умовний UPDATE і бронь із TTL не дають продати зайвого, а друга дата отримує свій рядок і свою чергу.
- Notification system. Коди й розсилки — Сповіщення магазину: коди OTP і рекламні розсилки йдуть різними шляхами (bulkhead), тому Black Friday не затримує вхід в акаунт, а запасний провайдер рятує коди під час аварії.
- Logging pipeline. Buffer і sampling — Збирання логів 3000 сервісів: buffer, щоб agents не втрачали даних, коли індекс не встигає, і sampling, коли шторм довший за буфер.
- News feed. Fan-out on write і гібрид — Стрічка соцмережі на 5 млн DAU: готові timelines у cache, fan-out через queue, а коли приходять celebrities — гібрид, на якому ще й заощаджуємо.
- Chat. Месенджер для команд — Чат для команд у Європі та США: доставка подій через gateways, сервіс у двох регіонах з одним write leader, порядок повідомлень і що втрачається, коли зникає регіон.
- Video. Завантаження і перегляд — Відеоплатформа для онлайн-курсів: байти повз servers — завантаження за presigned URL в object storage, перегляд через CDN, — а перекодування у фоні, де workers тримають під звичайний вечір, а не під пік.
- File sync. Файли на всіх пристроях — Синхронізація файлів для команд: metadata окремо від вмісту, шматки в object storage, зміни через event bus за схемою notify-then-pull, а після збою — повернення клієнтів без каскаду.
- Ride matching. Таксі у двох регіонах — Сервіс таксі в Європі та США: координати водіїв повз database, свій потік у кожному регіоні (geo-partitioning), а в новорічну ніч — поділ Європи на cells.
- Payments. Платіжний шлюз — Шлюз платежів для магазинів: ніколи не списати двічі (idempotency key), не втратити підтверджений платіж (RPO = 0, transactional outbox) і пережити втрату регіону.