English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

гість
1 / ?
назад до уроків

Вузли, ребра, напрямки

Запит як хід у графі

Кожен компонент, до якого торкається запит, є вузлом: клієнт, DNS-розв'язувач, крайовий вузол CDN, зворотний проксі, репліка бекенду, база даних, кеш.

Кожне з'єднання між двома вузлами є орієнтованим ребром: запити рухаються вперед, відповіді — назад. Пряме ребро представляє відкрите TCP-з'єднання та протокол поверх нього.

Один запит є шляхом крізь цей граф. Загальна робота, яку система виконує для відповіді на запит, дорівнює сумі роботи на кожному вузлі плюс затримка кожного ребра.

Чому це важливо? Як тільки ви побудуєте граф, стають очевидними властивості, які невидимі в коді:

- Кількість стрибків (hop count): кількість ребер у шляху. Кожен стрибок додає затримку (обмін даними в мережі + обробка вузлом). Менше стрибків = нижча межа затримки.

- Вхідний ступінь (in-degree): скільки ребер вказують НА вузол. Високий вхідний ступінь означає, що вузол отримує запити з багатьох джерел і повинен масштабуватися або захищати себе.

- Вихідний ступінь (out-degree): скільки ребер виходять З вузла. Високий вихідний ступінь означає, що вузол залежить від багатьох нижчих рівнів і має багато способів зламатися.

- Розривний вершинний (cut vertex): окремий вузол, видалення якого розриває граф. Зворотний проксі без резервного вузла є розривним вершинним; його видалення прибирає весь доступ до його початкових точок.

Запит як шлях через орієнтований граф: клієнт, проксі, бекенд, база даних

Нанесіть (або описіть текстом) граф запиту для: браузер клієнта -> край CDN -> зворотний проксі -> репліка бекенду -> база даних. Підрахуйте кількість стрибків. Визначте розривні вершини. Передбачте один операційний наслідок наявності так багатьох розривних вершин поспіль.

Де зосереджується трафік

Збіг = Концентрація

Ступінь входу вузла = кількість ребер, що вказують на нього. У графі запитів ступінь входу = кількість джерел вищого рівня, які надсилають запити.

Візерунок збірання (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.

Репліка бекенду викликає 4 нижчорівневі сервіси, кожен із яких має доступність 99,95%. (1) Яка верхня межа доступності бекенду, якщо для успішної відповіді потрібні всі 4 виклики? (2) Якщо 2 з 4 нижчорівневих сервісів стають необов'язковими завдяки плавному погіршенню якості обслуговування (замінюються кешованими резервними варіантами при недоступності), якою стане ця межа?

Вставлений вузол забезпечує гнучкість

Непряме посилання = додавання проміжного вузла

Без проксі граф виглядає так: client -> backend. Клієнт має знати адресу бекенду. Переміщення бекенду вимагає оновлення клієнта (через DNS або конфігурацію). Це є жорстке зв'язування.

З проксі граф стає таким: client -> proxy -> backend. Клієнт знає лише про проксі. Переміщення бекенду вимагає оновлення конфігурації upstream проксі, а не клієнта.

Операція над графом: вставка вузла вздовж наявного ребра. Нове ребро client -> proxy є стабільним; нове ребро proxy -> backend тепер перебуває під контролем команди.

Геометрична інтерпретація: непряме посилання додає шар, який розв'язує зміни upstream від змін downstream. Ребра кожного шару можуть перепідключатися незалежно.

Вартість опосередкування

Кожен шар додає:

- Один додатковий крок затримки (ребро від клієнта до проксі)

- Ще одну точку розриву на шляху (саме проксі)

- Ще одне місце, де може статися неправильна конфігурація

Переваги (перепідключення, масштабування, захист, термінування TLS, розподіл навантаження) зазвичай перевищують вартість для будь-якої нетривіальної системи. Але є межа: кожен шар опосередкування додає ще один крок та ще одного кандидата на роль одинокної точки відмови (SPOF).

Побутове правило: будь-яку проблему можна вирішити, додавши шар опосередкування (окрім проблеми надмірної кількості шарів опосередкування).

Команда додає CDN перед існуючим зворотним проксі. Шлях змінюється з `client -> proxy -> backend` (2 кроки) на `client -> CDN -> proxy -> backend` (3 кроки). Назвіть дві переваги опосередкування (терміни теорії графів вітаються) та дві вартості.

Читання архітектури як графа

Синтез

Тепер ви можете читати архітектуру системи як граф: рахувати хопи, ідентифікувати розривні вершини, вимірювати концентрацію вхідного ступеня зв'язності, обчислювати верхні межі доступності на основі вихідного ступеня зв'язності та оцінювати компроміси, пов'язані з посередництвом.

Застосуйте всі чотири.

У нової сервісу така архітектура: clients -> CDN -> reverse proxy (2 replicas) -> backend tier (8 replicas) -> { DB primary, cache cluster (3 nodes), external API }.

Проаналізуйте: (1) яке максимальне число хопів на одному шляху запиту, (2) який шар має найвищу концентрацію вхідного ступеня зв'язності (і що це означає для масштабування), (3) яка верхня межа доступності бекенду, якщо доступність БД становить 99,95%, кешу — 99,95%, зовнішнього API — 99,9%, і всі вони є обов'язковими, та (4) видалення якої однієї вершини призведе до розриву з'єднання з найбільшою кількістю користувачів?

Додаткові нотатки

Додаткові нотатки

Цей урок з геометрії переосмислює головний урок Проксі та джерела як аналіз орієнтованого графа.

Наступний супутній урок у цьому курсі, geometry_of_stateless_horizontal_scaling, бере математичні розрахунки реплікації з головного уроку масштабування та геометрично виводить криву чергування, закон Літлза та коліно при 80% завантаженні.

Молодець.