Як масштабувати веб-додаток: від одного сервера до розподіленої системи

Як масштабувати веб-додаток: від одного сервера до розподіленої системи

Більшість веб-додатків починають з одного сервера. Це просто, дешево і цілком достатньо для старту. Але що відбувається коли трафік зростає? Сервер починає повільніше відповідати, потім зависати, потім падати під навантаженням. Саме в цей момент починається розмова про масштабування — і виявляється що це значно ширша тема ніж просто "купити більший сервер".

Вертикальне і горизонтальне масштабування

Існують два фундаментально різні підходи до масштабування.

Вертикальне масштабування — це збільшення ресурсів одного сервера: більше CPU, більше RAM, швидші диски. Простий і зрозумілий підхід з мінімальними змінами в архітектурі. Але має жорстку межу — існує максимально потужний сервер який можна купити. Крім того єдиний сервер це єдина точка відмови.

Горизонтальне масштабування — це додавання нових серверів і розподіл навантаження між ними. Теоретично не має верхньої межі і забезпечує відмовостійкість. Але вимагає значно складнішої архітектури: додаток повинен бути спроектований для роботи в кількох екземплярах одночасно.

Load Balancer

Load balancer — перший крок до горизонтального масштабування. Це компонент який приймає вхідні запити і розподіляє їх між кількома серверами. Nginx, HAProxy, AWS Application Load Balancer — популярні варіанти.

Але load balancer створює нову проблему: якщо користувач робить запит до одного сервера а наступний запит потрапляє на інший — де зберігається його сесія? Відповідь: сесії не повинні зберігатися на серверах додатку. Замість цього використовується спільне сховище — Redis або Memcached — яке доступне всім екземплярам додатку.

Кешування

Кешування — один з найефективніших інструментів масштабування. Якщо результат дорогого запиту до бази даних можна зберегти і повторно використати — навантаження на базу даних значно знижується.

Redis — найпоширеніший інструмент для кешування. Він зберігає дані в пам'яті що забезпечує мікросекундний час відповіді. Кешувати можна результати SQL запитів, відповіді зовнішніх API, сесії користувачів, обчислені результати.

CDN — Content Delivery Network — кешує статичні ресурси на серверах розподілених по всьому світу. Коли користувач з Європи запитує зображення з вашого сайту — CDN віддає його з найближчого європейського вузла замість вашого основного сервера в Україні. Cloudflare, AWS CloudFront, Fastly — популярні CDN провайдери.

База даних як вузьке місце

Найчастіше при масштабуванні першою "падає" база даних. Додаток можна легко запустити в десяти екземплярах але всі вони звертаються до однієї бази даних.

Read replicas — репліки бази даних тільки для читання. Більшість запитів до бази даних в типовому додатку це читання а не запис. Розподіливши запити на читання між репліками можна значно знизити навантаження на основний сервер.

Database sharding — розподіл даних між кількома базами даних. Наприклад користувачі з ID від одного до мільйона зберігаються в одній базі, від мільйона до двох мільйонів в іншій. Ефективно але значно ускладнює архітектуру.

Асинхронна обробка і черги

Не всі операції потрібно виконувати синхронно. Відправка email, генерація PDF, обробка зображень, складні обчислення — все це можна виконувати асинхронно через черги завдань.

RabbitMQ, Redis Queue, AWS SQS — популярні системи черг. Користувач відправляє запит, сервер кладе завдання в чергу і одразу відповідає що завдання прийнято. Окремі воркери обробляють завдання з черги в фоновому режимі. Це знижує час відповіді і дозволяє масштабувати обробку незалежно від основного додатку.

Мікросервіси

При дуже великому масштабі монолітний додаток стає обмеженням. Мікросервісна архітектура розбиває його на незалежні сервіси кожен з яких можна масштабувати окремо. Якщо навантаження зростає тільки на модуль пошуку — масштабується тільки він без необхідності додавати ресурси для всіх інших модулів.

Але мікросервіси додають значну операційну складність і виправдані тільки при дійсно великому масштабі і достатньо великій команді.

Масштабування — це не одноразове рішення а постійний процес адаптації архітектури до зростаючих вимог. Починати з простого і масштабувати поступово у відповідь на реальні проблеми — значно розумніша стратегія ніж будувати надскладну архітектуру для навантаження яке може ніколи не наступити.

Поділитися
У пошуках підрядника з розробки сайту?
Заходьте до нашого online каталогу Веб-студій та вибирайте партнера за рядом критеріїв: бал, портфоліо, відгуки, кейси та статті. Або організуйте тендер в даному каталозі, вибравши компанії, що вам сподобалися.
Більше не потрібно шукати та обдзвонювати діджитал-агентства!
Створіть тендер та отримайте пропозиції від найкращих веб-студій України.
У каталозі 1700+ діджитал-агентств, які готові допомогти в реалізації ваших завдань. Вибирайте та економте до 30% свого часу та бюджету! Це безкоштовно та займе менше 3-х хвилин.
Створити тендер
Bug