Пошук уроків, статей та іншого контенту
Навчитеся фіксувати обмеження й припущення, перевіряти їх та враховувати під час ухвалення архітектурних рішень.
Перед проєктуванням системи потрібно зрозуміти, у яких умовах вона має працювати. Для цього фіксують:
обмеження — правила або межі, яких система зобов’язана дотримуватися;
припущення — твердження про систему чи середовище, які ми вважаємо правдивими, але ще не підтвердили.
Ці поняття впливають на архітектурні рішення. Якщо їх не зафіксувати, команда може спроєктувати систему, яка формально працює, але не відповідає реальним умовам.
Уявімо сервіс скорочення посилань.
Можливі обмеження:
сервіс має працювати в одному хмарному регіоні;
бюджет на інфраструктуру обмежений;
посилання не можна втрачати після створення;
API має відповідати не довше ніж за 200 мс для 95% запитів.
Можливі припущення:
щодня створюватиметься близько 1 мільйона посилань;
середня довжина оригінального URL — 200 байт;
більшість запитів буде на перенаправлення, а не на створення посилань;
користувачі не редагуватимуть уже створені посилання.
Припущення можуть виявитися помилковими. Тому їх потрібно явно записувати й перевіряти.
Обмеження задають межі, у яких потрібно знайти рішення. Вони можуть походити з різних джерел.
Визначаються продуктом, бюджетом або правилами компанії:
максимальна вартість інфраструктури;
дата запуску;
підтримка лише певних країн;
вимога використовувати вже наявну систему авторизації;
заборона залежати від конкретного постачальника.
Пов’язані з наявною інфраструктурою або технологіями:
використання конкретної бази даних;
обмежений обсяг пам’яті;
підтримка лише певної версії середовища;
максимальна пропускна здатність мережі;
робота в одному регіоні або дата-центрі.
Стосуються експлуатації системи:
допустимий час простою;
час відновлення після збою;
необхідність резервного копіювання;
доступність команди підтримки;
вимоги до моніторингу та журналювання.
Це межі самої поведінки системи:
максимальний розмір файлу;
максимальна кількість елементів у запиті;
обмеження частоти запитів;
час відповіді;
обсяг даних, який потрібно зберігати.
Обмеження не завжди є негативними. Вони зменшують кількість можливих рішень і допомагають ухвалювати конкретні архітектурні рішення.
Припущення виникають там, де інформації ще недостатньо. Наприклад:
«Користувачі зазвичай виконуватимуть не більше 10 запитів на хвилину».
«Розмір одного документа не перевищуватиме 5 МБ».
«Для читання даних потрібна нижча затримка, ніж для запису».
«Дані можна видаляти через 30 днів».
«Зовнішній сервіс буде доступний більшу частину часу».
Припущення допомагають рухатися вперед, але вони створюють ризик. Якщо припущення помилкове, архітектура може перестати відповідати вимогам.
Хороше припущення:
сформульоване конкретно;
має числове значення або чітку межу;
має джерело або пояснення;
може бути перевірене;
має вказаний рівень упевненості.
Погано:
Система матиме багато користувачів.
Краще:
У перші шість місяців очікується до 100 000 активних користувачів на місяць, із рівнем упевненості 60%.
Ще краще — додати спосіб перевірки:
Значення перевіримо за статистикою поточного продукту або результатами навантажувального тестування.
Поставте запитання: це вже відоме правило чи наша оцінка невідомого?
Якщо відповідь підтверджена договором, вимогою або технічною можливістю, це, ймовірно, обмеження.
Якщо відповідь ґрунтується на прогнозі, досвіді або неповній інформації, це припущення.
«API має підтримувати HTTPS» — обмеження.
«Усі клієнти підтримують HTTPS» — припущення, якщо це ще не перевірено.
«База даних має залишатися PostgreSQL» — обмеження.
«PostgreSQL витримає 10 000 записів за секунду» — припущення до проведення тестів.
«Відновлення після аварії має тривати не більше години» — обмеження.
«Резервна копія відновиться за 20 хвилин» — припущення до перевірки.
Одне й те саме твердження може змінити категорію. Наприклад, очікуване навантаження спочатку є припущенням. Після затвердження продуктом воно може стати офіційною вимогою або обмеженням для проєктування.
Не покладайтеся на пам’ять або лише на усні обговорення. Для кожного пункту корисно записати:
формулювання;
тип: обмеження або припущення;
джерело;
значення або межу;
рівень упевненості;
спосіб перевірки;
вплив на архітектуру;
відповідального;
дату повторного перегляду.
Наприклад:
Тип: припущення
Формулювання: до 1 мільйона нових посилань на день
Упевненість: середня
Перевірка: аналіз статистики аналогічного сервісу
Вплив: потрібен запас для запису та генерації унікальних ідентифікаторів
Відповідальний: продуктова команда
Перегляд: після першого місяця роботи
Для невеликого проєкту достатньо звичайного документа або розділу в технічному описі. Головне — щоб записи були доступними всім учасникам.
Не всі припущення потрібно перевіряти однаково. Спочатку перевіряють ті, які:
мають високий вплив на архітектуру;
мають низький рівень упевненості;
можуть призвести до значних витрат;
складно змінити після запуску;
стосуються безпеки, надійності або втрати даних.
Залежно від припущення можна використати:
аналіз існуючої статистики;
уточнення вимог у зацікавлених сторін;
прототип;
навантажувальний тест;
тест із реальною базою даних;
вимірювання затримки;
перевірку документації постачальника;
пілотний запуск для обмеженої кількості користувачів.
Припущення:
Система зможе обробляти 500 запитів на секунду на одному сервері.
Можливий план перевірки:
Визначити типовий запит.
Підготувати тестові дані.
Запустити навантаження в 500 запитів на секунду.
Виміряти затримку, використання CPU, пам’яті та бази даних.
Повторити тест із запасом, наприклад на 750 запитів на секунду.
Зафіксувати результати та оновити архітектурне рішення.
Важливо перевіряти не лише середній результат. Для затримки часто аналізують також гірші випадки, наприклад час відповіді для 95-го або 99-го процентиля запитів.
Обмеження та припущення не повинні залишатися окремим списком. Їх потрібно пов’язувати з рішеннями.
Припущення:
Запити на читання траплятимуться у 20 разів частіше, ніж запити на запис.
Можливі наслідки:
оптимізація індексів для читання;
кешування часто запитуваних даних;
окремий аналіз навантаження на читання та запис;
готовність до масштабування компонентів, які обслуговують читання.
Якщо припущення зміниться, наприклад співвідношення стане 1:1, ці рішення потрібно переглянути.
Не варто проєктувати систему рівно під очікуване значення. Потрібно враховувати запас.
Якщо очікується 1 мільйон запитів на день, корисно оцінити:
середню кількість запитів за секунду;
пікове навантаження;
необхідний запас;
поведінку системи при перевищенні межі.
Орієнтовну середню кількість запитів можна обчислити так:
середня кількість запитів за секунду =
кількість запитів за день / кількість секунд у добіАле середнє значення не описує піки. Навантаження може бути набагато вищим у робочі години або під час рекламної кампанії.
Цей приклад оцінює середнє навантаження, обсяг нових даних і рекомендований запас.
const assumptions = {
newLinksPerDay: 1_000_000,
averageLinkSizeBytes: 200,
peakMultiplier: 5,
safetyMargin: 1.5,
};
const secondsPerDay = 24 * 60 * 60;
const averageRequestsPerSecond =
assumptions.newLinksPerDay / secondsPerDay;
const estimatedPeakRequestsPerSecond =
averageRequestsPerSecond * assumptions.peakMultiplier;
const dailyStorageBytes =
assumptions.newLinksPerDay * assumptions.averageLinkSizeBytes;
const storageWithMarginBytes =
dailyStorageBytes * assumptions.safetyMargin;
function toGiB(bytes) {
return bytes / (1024 ** 3);
}
console.log(`Середнє навантаження: ${averageRequestsPerSecond.toFixed(2)} запитів/с`);
console.log(`Оціночне пікове навантаження: ${estimatedPeakRequestsPerSecond.toFixed(2)} запитів/с`);
console.log(`Дані за день: ${toGiB(dailyStorageBytes).toFixed(2)} GiB`);
console.log(`Дані із запасом: ${toGiB(storageWithMarginBytes).toFixed(2)} GiB`);У цьому прикладі всі числа є припущеннями. Якщо змінити newLinksPerDay або peakMultiplier, зміняться й оцінки. Це показує, чому важливо зберігати не лише рішення, а й значення, на яких воно ґрунтується.
Не всі припущення можна перевірити одразу. У такому разі потрібно зменшити ризик.
додати запас продуктивності;
обмежити обсяг першого запуску;
використати конфігурацію, яку легко змінити;
додати моніторинг потрібного показника;
підготувати альтернативний план;
зробити припущення явною частиною ризиків.
Наприклад, якщо невідомо, чи буде пікове навантаження в 5 чи 20 разів більшим за середнє, можна:
запустити систему з обмеженням частоти запитів;
додати метрики пікового навантаження;
зробити масштабування конфігурованим;
переглянути оцінку після появи реальної статистики.
Це краще, ніж одразу створювати складну архітектуру для найгіршого сценарію без доказів, що він настане.
Під час підготовки архітектури використовуйте такий порядок:
Зберіть факти.
Запишіть вимоги, доступні ресурси, правила, дедлайни та відомі обмеження.
Відокремте припущення.
Позначте твердження, які ще не підтверджені.
Додайте числа.
Замість «велике навантаження» запишіть кількість користувачів, запитів або даних.
Оцініть вплив.
Визначте, які рішення залежать від кожного припущення.
Перевірте найризикованіші пункти.
Використайте статистику, прототип або тест.
Зафіксуйте рішення.
Запишіть, чому обрано конкретний компонент або підхід.
Визначте умови перегляду.
Наприклад: «переглянути після досягнення 10 000 активних користувачів».
Оновлюйте записи.
Після появи нових даних припущення може стати підтвердженим фактом або виявитися неправильним.
Фраза «система витримає навантаження» не є доказом. Потрібно вказати конкретне навантаження та спосіб перевірки.
Слова «швидко», «багато», «рідко» та «великий» не дають змоги ухвалити технічне рішення. Замініть їх вимірюваними значеннями.
Середнє значення може приховувати короткочасні піки. Завжди уточнюйте, коли саме виникає навантаження і наскільки воно може зрости.
Список припущень без зв’язку з архітектурою швидко застаріває. Для кожного важливого пункту пояснюйте, яке рішення від нього залежить.
Після запуску з’являються реальні дані. Якщо не оновлювати припущення, система продовжить розвиватися на основі неточної інформації.
Невідомість не завжди виправдовує складну архітектуру. Спочатку оцініть і перевірте ризик, а потім додавайте складність, якщо це справді потрібно.
Обмеження — це відомі правила та межі, яких система має дотримуватися.
Припущення — це непідтверджені твердження, необхідні для руху вперед.
Припущення потрібно формулювати конкретно, бажано з числами.
Найважливіші припущення слід перевіряти за допомогою статистики, прототипів або тестів.
Архітектурні рішення мають бути пов’язані з обмеженнями та припущеннями, на яких вони ґрунтуються.
Непідтверджені припущення потрібно супроводжувати запасом, моніторингом і умовами перегляду.
Документування цих пунктів допомагає команді бачити ризики та своєчасно змінювати архітектуру.