Архитектура Serverless: AWS Lambda, Vercel и Cloud Functions
Архитектура serverless позволяет запускать код без управления серверами. Это руководство охватывает концепции serverless, AWS Lambda, Vercel и использование Cloud Functions.
Обновлено:Что такое Serverless?
Serverless — это модель облачных вычислений, позволяющая запускать код без управления серверами. Серверы всё ещё существуют, но вы ими не управляете.
FaaS (Function as a Service): вы развёртываете свой код как функцию. Облачный провайдер выполняет функцию при поступлении запроса и возвращает результат.
BaaS (Backend as a Service): вы используете backend-сервисы, такие как база данных, аутентификация, хранилище, как managed. Как Firebase, Supabase.
Преимущества: нет управления серверами, автоматическое масштабирование, оплата за использование, нулевая стоимость в idle.
AWS Lambda
AWS Lambda — это serverless compute-сервис AWS. Поддерживает runtimes Node.js, Python, Java, Go, .NET, Ruby.
Handler: точка входа функции. Определяется как exports.handler = async (event, context) => { ... }.
Trigger: события, запускающие функцию Lambda. API Gateway (HTTP), S3 (загрузка файла), DynamoDB (изменение данных), SQS (очередь сообщений).
Cold start: функция должна инициализироваться при первом вызове. Это создаёт задержку 100мс-1с. Можно уменьшить с помощью provisioned concurrency.
Лимиты: максимум 15 минут времени выполнения, 10 ГБ памяти, 10 ГБ эфемерного хранилища. Оптимизируйте настройки timeout и memory.
Vercel и Netlify
Vercel: serverless-платформа, оптимизированная для фреймворков, таких как Next.js, Nuxt, SvelteKit. Поддержка Edge Functions и Serverless Functions.
Netlify: хостинг статических сайтов + serverless-функции. Добавляйте backend-логику с помощью Netlify Functions (на базе AWS Lambda).
Edge Functions: функции, выполняющиеся на edge с помощью Cloudflare Workers или Vercel Edge Runtime. Ультранизкая задержка.
Преимущества: автоматический deploy при git push, preview deployments, глобальный CDN, автоматический HTTPS. Отличный developer experience.
Использование: JAMstack-приложения, API-эндпоинты, обработка форм, оптимизация изображений, аутентификация.
Cold Start и производительность
Cold start: контейнер должен запуститься при первом вызове функции. Это добавляет задержку. Warm-функции работают быстрее.
Стратегии уменьшения: provisioned concurrency (AWS Lambda), keep-alive (периодический ping), меньший bundle, более быстрый runtime (Node.js > Java).
Оптимизация памяти: больше памяти = больше CPU. Можно уменьшить время cold start, увеличив память.
Connection pooling: создавайте соединения с базой данных вне функции (global scope). Не открывайте новое соединение при каждом вызове.
Мониторинг: отслеживайте время cold start и частоту ошибок с помощью CloudWatch (AWS), Vercel Analytics.
Лучшие практики Serverless
Stateless: функции должны быть stateless. Храните состояние во внешнем хранилище (DynamoDB, Redis).
Идемпотентность: многократный запуск функции должен давать одинаковый результат. Должен быть безопасным для retries и дублирующихся событий.
Обработка ошибок: перехватывайте ошибки и отправляйте в dead letter queue (DLQ). Определяйте механизм retry.
Безопасность: роли IAM с least privilege. Управление секретами с помощью переменных среды. Валидация ввода.
Оптимизация затрат: оптимизируйте memory и timeout. Уменьшайте ненужные вызовы. Используйте provisioned concurrency с осторожностью.
Serverless vs Container vs VM
Serverless: нулевое управление, автоматическое масштабирование, оплата за использование. Идеально для короткоживущих, событийно-ориентированных операций.
Container (Docker/K8s): больше контроля, длительные операции, stateful-приложения. Требуется оркестрация.
VM: полный контроль, legacy-приложения, специальные требования к оборудованию. Наибольшая стоимость управления.
Выбор: короткие, событийно-ориентированные операции → Serverless. Длительные, stateful-приложения → Container. Legacy и специальные требования → VM.