Ваш Serverless бреше вам щодо масштабування
Serverless-обчислення обіцяють нескінченне масштабування та нульові накладні витрати. Такі платформи, як AWS Lambda або Google Cloud Run, миттєво масштабують ваші обчислювальні рівні.
Але ваш бекенд усе одно падає.
Проблема не в обчисленнях. Проблема у вашій базі даних.
Коли ваші функції масштабуються, вони створюють «шторм з'єднань» (connection storm). Кожен новий екземпляр функції намагається відкрити нове з'єднання з вашою базою даних. Якщо у вас 1 000 функцій, це означає 1 000 запитів на з'єднання, які одночасно надходять до вашого екземпляра Postgres або MySQL.
Реляційні бази даних мають жорсткі ліміти. Як тільки ви досягаєте цього ліміту, нові з'єднання не встановлюються. Це призводить до високої затримки та помилок 5xx. Ваші обчислювальні ресурси готові, але ваша база даних не витримує навантаження.
Ви можете вирішити це за допомогою трьох стратегій:
Використовуйте проксі для з'єднань Не підключайте функції безпосередньо до вашої бази даних. Використовуйте проксі, наприклад AWS RDS Proxy або Google Cloud SQL Proxy. Цей рівень знаходиться між вашими функціями та базою даних. Він керує невеликим пулом постійних з'єднань і розподіляє їх між вашими багатьма функціями.
Впровадьте рівні проксіювання даних Просунуті проксі роблять більше, ніж просто керування з'єднаннями. Вони можуть:
- Розподіляти читання та запис між різними екземплярами баз даних.
- Кешувати часті запити, щоб зменшити навантаження на базу даних.
- Оптимізувати запити перед тим, як вони потраплять до бази даних.
- Перейдіть на асинхронний запис Припиніть робити кожну дію користувача синхронним записом у базу даних. Багатьом завданням не потрібна миттєва узгодженість (consistency).
Замість цього: User Action -> Function -> Sync DB Write -> Response
Спробуйте так: User Action -> Function -> Push Event to Queue -> Fast Response
Окрема функція може потім підхопити цю подію та записати дані в базу пізніше. Це захищає вашу базу даних від раптових сплесків трафіку.
Справжня масштабованість потребує більшого, ніж просто масштабування обчислень. Ви повинні проектувати систему з розрахунком на еластичний доступ до даних. Припиніть виділяти ресурси під теоретичні максимуми. Почніть створювати буфери між вашими функціями, що мають різкі сплески навантаження, і вашими даними.
Джерело: https://dev.to/prabashanadev/your-serverless-is-lying-to-you-about-scale-4cga