Вузли, ребра, напрямки
Запит як хід у графі
Кожен компонент, до якого торкається запит, є вузлом: клієнт, DNS-розв'язувач, крайовий вузол CDN, зворотний проксі, репліка бекенду, база даних, кеш.
Кожне з'єднання між двома вузлами є орієнтованим ребром: запити рухаються вперед, відповіді — назад. Пряме ребро представляє відкрите TCP-з'єднання та протокол поверх нього.
Один запит є шляхом крізь цей граф. Загальна робота, яку система виконує для відповіді на запит, дорівнює сумі роботи на кожному вузлі плюс затримка кожного ребра.
Чому це важливо? Як тільки ви побудуєте граф, стають очевидними властивості, які невидимі в коді:
- Кількість стрибків (hop count): кількість ребер у шляху. Кожен стрибок додає затримку (обмін даними в мережі + обробка вузлом). Менше стрибків = нижча межа затримки.
- Вхідний ступінь (in-degree): скільки ребер вказують НА вузол. Високий вхідний ступінь означає, що вузол отримує запити з багатьох джерел і повинен масштабуватися або захищати себе.
- Вихідний ступінь (out-degree): скільки ребер виходять З вузла. Високий вихідний ступінь означає, що вузол залежить від багатьох нижчих рівнів і має багато способів зламатися.
- Розривний вершинний (cut vertex): окремий вузол, видалення якого розриває граф. Зворотний проксі без резервного вузла є розривним вершинним; його видалення прибирає весь доступ до його початкових точок.
Де зосереджується трафік
Збіг = Концентрація
Ступінь входу вузла = кількість ребер, що вказують на нього. У графі запитів ступінь входу = кількість джерел вищого рівня, які надсилають запити.
Візерунок збірання (fan-in): багато клієнтів -> один CDN; багато країв CDN -> небагато проксі-серверів походження; багато проксі -> менша кількість реплік бекенду; багато бекендів -> єдина база даних.
Концентрація має значення, оскільки вузол із найвищим ступенем входу (in-degree) бачить найбільшу агреговану навантаження. БД наприкінці ланцюжка може отримувати запити від кожного активного запиту в системі, навіть якщо жоден окремий користувач не генерує великого обсягу.
Розгалуження (Fan-Out) = Залежність
Ступінь виходу (out-degree) вузла = кількість ребер, що виходять із нього. Високий ступінь виходу означає багато залежностей у нижчих шарах.
Бекенд, який викликає базу даних, два кеші, три зовнішні API та чергу, має ступінь виходу 7. Ймовірність його успіху приблизно дорівнює добутку ймовірностей успіху кожного нижчого шару (якщо всі вони необхідні для успішної відповіді).
0.999 ^ 7 ≈ 0.993: бекенд із 7 нижчими шарами, кожен із надійністю 99,9%, може досягти лише ~99,3% надійності сам по собі, навіть без власних помилок.
Зменшіть ступінь виходу за допомогою: кешування результатів нижчих шарів, роблячи не критичні нижчі шари необов'язковими (м'яке погіршення якості), паралелізація того, що можна паралелізувати.
Асиметрія
Fan-in концентрує навантаження; fan-out множить ризик. Граф із правильною структурою мінімізує обидва показники на вузлах із найвищим впливом.
База даних (найвищий fan-in): агресивно використовуйте кешування для зменшення навантаження. Використовуйте репліки для читання, щоб розподілити fan-in між кількома вузлами.
Сервіс-оркестратор (найвищий fan-out): обривники кола (circuit breakers) для кожної залежності, плавне погіршення якості обслуговування (graceful degradation), bulkheads.
Вставлений вузол забезпечує гнучкість
Непряме посилання = додавання проміжного вузла
Без проксі граф виглядає так: client -> backend. Клієнт має знати адресу бекенду. Переміщення бекенду вимагає оновлення клієнта (через DNS або конфігурацію). Це є жорстке зв'язування.
З проксі граф стає таким: client -> proxy -> backend. Клієнт знає лише про проксі. Переміщення бекенду вимагає оновлення конфігурації upstream проксі, а не клієнта.
Операція над графом: вставка вузла вздовж наявного ребра. Нове ребро client -> proxy є стабільним; нове ребро proxy -> backend тепер перебуває під контролем команди.
Геометрична інтерпретація: непряме посилання додає шар, який розв'язує зміни upstream від змін downstream. Ребра кожного шару можуть перепідключатися незалежно.
Вартість опосередкування
Кожен шар додає:
- Один додатковий крок затримки (ребро від клієнта до проксі)
- Ще одну точку розриву на шляху (саме проксі)
- Ще одне місце, де може статися неправильна конфігурація
Переваги (перепідключення, масштабування, захист, термінування TLS, розподіл навантаження) зазвичай перевищують вартість для будь-якої нетривіальної системи. Але є межа: кожен шар опосередкування додає ще один крок та ще одного кандидата на роль одинокної точки відмови (SPOF).
Побутове правило: будь-яку проблему можна вирішити, додавши шар опосередкування (окрім проблеми надмірної кількості шарів опосередкування).
Читання архітектури як графа
Синтез
Тепер ви можете читати архітектуру системи як граф: рахувати хопи, ідентифікувати розривні вершини, вимірювати концентрацію вхідного ступеня зв'язності, обчислювати верхні межі доступності на основі вихідного ступеня зв'язності та оцінювати компроміси, пов'язані з посередництвом.
Застосуйте всі чотири.
У нової сервісу така архітектура: clients -> CDN -> reverse proxy (2 replicas) -> backend tier (8 replicas) -> { DB primary, cache cluster (3 nodes), external API }.
Додаткові нотатки
Додаткові нотатки
Цей урок з геометрії переосмислює головний урок Проксі та джерела як аналіз орієнтованого графа.
Наступний супутній урок у цьому курсі, geometry_of_stateless_horizontal_scaling, бере математичні розрахунки реплікації з головного уроку масштабування та геометрично виводить криву чергування, закон Літлза та коліно при 80% завантаженні.
Молодець.