Технологии 14 мая 2026 · 11 мин чтения 252 0

Serverless архитектура: FaaS, BaaS, event-driven

Serverless — модель развёртывания, при которой разработчик пишет код, а провайдер сам выделяет, масштабирует и освобождает вычислительные ресурсы для его выполнения. Несмотря на название, серверы никуда не делись — они просто становятся невидимы для разработчика. Платформа сама поднимает инфраструктуру при поступлении нагрузки и убирает её при простое, оплата идёт за фактическое время выполнения и количество вызовов.

За десять лет с момента запуска AWS Lambda в 2014 году serverless из экспериментальной модели превратился в зрелую парадигму с собственными паттернами проектирования, набором подходящих и неподходящих сценариев, экосистемой инструментов. Эта статья описывает архитектуру serverless-приложений, ключевые компоненты, типичные сценарии и антипаттерны, ситуации, в которых модель работает лучше или хуже альтернатив.

Что такое serverless

Serverless — это не одна технология, а семейство моделей развёртывания, объединённых общим принципом: разработчик не управляет серверами, не масштабирует их, не платит за их простой. Базовые признаки:

  • Полное управление инфраструктурой на стороне провайдера
  • Автоматическое масштабирование от нуля до тысяч инстансов
  • Оплата по фактическому использованию (per-request, per-execution)
  • Высокая доступность из коробки без явных настроек
  • Stateless или managed-state модели

В широком смысле serverless включает FaaS (функции), serverless-контейнеры, managed-БД, очереди, аналитические платформы. Узкое определение чаще ограничивается FaaS — выполнением кода в ответ на события без управления серверной инфраструктурой.

FaaS как ядро serverless

Function as a Service — основная и самая известная модель serverless-вычислений. Разработчик пишет функцию, привязывает её к триггеру (HTTP-запрос, сообщение в очереди, изменение в БД, событие в S3), а платформа сама управляет её запуском и масштабированием.

Жизненный цикл функции

  1. Разработчик загружает код функции в платформу
  2. Платформа компилирует и кеширует артефакт
  3. При поступлении триггера создаётся (или переиспользуется) инстанс функции
  4. Функция выполняется с заданными лимитами по времени, памяти, CPU
  5. Результат возвращается источнику триггера или передаётся дальше
  6. Инстанс может быть переиспользован для следующих вызовов в течение нескольких минут
  7. Неиспользуемые инстансы освобождаются

Основные платформы FaaS

Платформа Особенности
AWS Lambda Первая массовая FaaS-платформа, стандарт индустрии
Azure Functions Тесная интеграция с экосистемой Microsoft, durable functions
Google Cloud Functions Простая модель, интеграция с GCP-сервисами
Cloudflare Workers Edge-выполнение на 300+ локациях, V8 isolates вместо контейнеров
Vercel Functions FaaS на верхнем уровне Next.js-приложений
Yandex Cloud Functions Российская альтернатива, интеграция с экосистемой Yandex
Fastly Compute@Edge Wasm-based edge-функции

Event-driven архитектура

Serverless-приложения почти всегда event-driven: компоненты общаются через события, а не через прямые вызовы. Это органично сочетается с FaaS-моделью, где функция запускается событием и выполняется в изоляции.

Типичные источники событий

  • HTTP-запросы через API Gateway или CDN
  • Сообщения в очередях: SQS, EventBridge, Kafka, Pub/Sub
  • Изменения в БД: DynamoDB Streams, MongoDB Change Streams
  • Загрузки файлов: S3, Azure Blob, Google Cloud Storage
  • Расписания: cron-триггеры для регулярных задач
  • IoT-сообщения: MQTT, AWS IoT Events
  • Stream-сообщения: Kinesis, Kafka, Event Hubs

Event sourcing и CQRS в serverless

Концепция event sourcing — хранение состояния системы как последовательности событий, а не текущего снимка — органично ложится на serverless. Каждое событие может запускать функцию, обновляющую проекции данных для разных view-моделей. CQRS (Command Query Responsibility Segregation) разделяет операции записи и чтения, что облегчает независимое масштабирование функций для каждого типа операций.

Cold start — главный технический challenge

Cold start — задержка первого вызова функции после простоя, когда платформа создаёт новый инстанс. Время cold start зависит от языка, размера кода, конфигурации памяти, использования VPC.

Среда выполнения Cold start
Node.js минимальная функция 100–300 мс
Python минимальная функция 200–500 мс
Java/JVM функция 2–10 секунд
.NET функция 1–3 секунды
Go компилируемая 100–400 мс
Rust скомпилированная 50–200 мс
Lambda в VPC +1–10 секунд
Cloudflare Workers (V8 isolates) 0.1–5 мс

Стратегии минимизации cold start

  1. Lightweight runtime: Node.js и Python стартуют быстрее тяжёлых JVM
  2. Provisioned concurrency: предоплаченные тёплые инстансы, не cold
  3. Меньший размер кода: удаление неиспользуемых зависимостей
  4. Ленивая инициализация: не загружать всё в момент старта
  5. Compiled runtime: Rust, Go, AOT-компиляция .NET и Java
  6. Edge runtime: V8 isolates вместо контейнеров (Cloudflare Workers, Vercel Edge)

Stateless как принцип

Функции должны быть stateless — не хранить состояния между вызовами. Платформа не гарантирует, что следующий вызов попадёт на тот же инстанс. State выносится в managed-сервисы: БД, кеши, файловые хранилища.

Где хранить состояние

Тип состояния Решение
Сессии пользователей DynamoDB, Redis (ElastiCache), Cookies с подписью
Кеш данных Redis, Memcached, MomentoDB
Постоянные данные DynamoDB, RDS, Aurora Serverless, Firestore
Файлы S3, Azure Blob, GCS
Состояние процессов Step Functions, Durable Functions, EventBridge Pipes
Очереди SQS, EventBridge, Kafka

Connection pools и stateless

Одна из практических сложностей serverless — управление подключениями к БД. Каждый инстанс функции создаёт свой пул, что приводит к взрывному росту числа соединений при масштабировании. Решения:

  • RDS Proxy или PgBouncer — посредник, агрегирующий соединения
  • Aurora Serverless v2 с автоматическим масштабированием
  • Serverless-БД (DynamoDB, Firestore) без классических пулов соединений
  • HTTP-based интерфейсы к БД (PostgREST, Hasura)

Backend as a Service

BaaS-компоненты дополняют FaaS, предоставляя готовые сервисы: аутентификацию, базы данных, файловые хранилища, real-time-каналы. Связка FaaS + BaaS закрывает основные потребности веб- и мобильных приложений без поднятия серверной инфраструктуры.

Популярные BaaS-сервисы

  • Firebase — полный стек от Google: Auth, Firestore, Realtime DB, Storage, Functions
  • Supabase — open source альтернатива Firebase на PostgreSQL
  • Appwrite — open source self-hostable BaaS
  • AWS Amplify — стек serverless-сервисов с client-SDK
  • Auth0, Clerk — managed-аутентификация
  • Stripe — серверless-обработка платежей с webhooks
  • Algolia, Meilisearch Cloud — search-as-a-service
  • SendGrid, Postmark — email-as-a-service

Когда serverless оправдан

Идеальные сценарии

  • API с нерегулярной нагрузкой и большой амплитудой между пиками
  • Обработка фоновых задач: трансформация изображений, отправка писем, генерация отчётов
  • Webhook-обработчики и интеграции между системами
  • Stream-processing с переменной нагрузкой
  • Cron-задачи и регулярные scheduled-операции
  • Mobile-backend с непредсказуемым числом активных пользователей
  • Прототипы и MVP-проекты
  • Edge-логика близко к пользователям

Когда serverless оправдан финансово

Профиль нагрузки Стоимость serverless Стоимость EC2
10 000 запросов в день, спайки $5–15 в месяц $30–60 в месяц
1 миллион запросов в день, равномерно $50–200 в месяц $30–100 в месяц
10 миллионов запросов в день, равномерно $500–2000 в месяц $200–800 в месяц
Сезонные пики 10x Пропорционально, минимум при простое Дорого: ресурсы под пик

Базовое правило: serverless выгоднее при низкой и переменной нагрузке. При стабильной высокой нагрузке EC2 или managed-контейнеры (Fargate, Cloud Run) могут оказаться дешевле в 2–5 раз.

Когда serverless неуместен

Антипаттерны

  1. Долгие вычисления: лимиты по времени выполнения (15 минут у Lambda) делают невозможным длительный inference, обучение моделей, тяжёлый ETL
  2. Высокая постоянная нагрузка: при равномерных миллионах rps выгоднее classic-инфраструктура с зарезервированными ресурсами
  3. Stateful-приложения: WebSocket-серверы с длительными соединениями, многопользовательские игры с реал-тайм-состоянием
  4. Латентность-критичные задачи без provisioned concurrency: cold start может убить SLO в 50 мс
  5. Tight coupling между функциями: микросервисная архитектура из 100 функций с синхронными вызовами друг друга превращается в монолит без преимуществ
  6. Большие объёмы данных в каждом запросе: limit на размер payload, ограничения по памяти
  7. Постоянные подключения к БД: connection-pool issues при масштабировании

Архитектурные паттерны

API Gateway + Lambda

Классический паттерн web-API: API Gateway принимает HTTP-запросы, маршрутизирует на соответствующие Lambda-функции, возвращает ответ клиенту. Простая, масштабируемая модель для CRUD-приложений и API средней сложности.

Fan-out с очередью

Одно событие производит несколько действий. Функция-orchestrator принимает событие и помещает сообщения в несколько очередей; функции-consumers независимо обрабатывают каждую очередь. Подходит для обработки заказов, регистрации пользователей, других сценариев с множеством побочных эффектов.

Pipeline через несколько очередей

Конвейерная обработка: данные проходят через цепочку очередей с функциями между ними. Каждый этап масштабируется независимо, отказ одного этапа не ломает остальные. Подходит для ETL, обработки документов, медиа-конвейеров.

Step Functions / Durable Functions

Управление сложными workflow с состоянием. Платформа сама хранит состояние между шагами, координирует параллельные ветки, обрабатывает retry и компенсации. Подходит для бизнес-процессов, согласований, многоэтапных интеграций.

Edge computing

Логика на CDN-узлах, близко к пользователям. A/B-тесты, аутентификация, персонализация, image-optimization, бот-защита. Сверхнизкая задержка за счёт географической близости.

Observability в serverless

Распределённая природа serverless усложняет мониторинг. Запрос проходит через десятки функций, очередей, БД; найти причину медленного ответа или ошибки сложнее, чем в монолите. Современный стек observability для serverless включает:

  • Distributed tracing: AWS X-Ray, Datadog APM, OpenTelemetry — отслеживание запроса по всем компонентам
  • Structured logging: JSON-логи с корреляционными ID для связывания событий разных функций
  • Metrics и алерты: CloudWatch, Datadog, New Relic — мониторинг latency, ошибок, throttling
  • Cost monitoring: AWS Cost Explorer, Vantage, специализированные инструменты — slowing growth счетов
  • Чёрный ящик мониторинг: synthetic-проверки API из внешних точек

Frameworks и инструменты

Категория Инструменты
Развёртывание Serverless Framework, AWS SAM, Pulumi, Terraform, CDK
Локальная разработка SAM Local, LocalStack, Serverless Offline, Wrangler (Cloudflare)
Тестирование Jest, Pytest с моками AWS SDK, AWS Lambda Test
Observability Lumigo, Thundra, Datadog, New Relic
Security Lambda Layers с агентами, OWASP serverless top 10
Cost optimization Vantage, Lumigo, AWS Cost Explorer

Vendor lock-in

Serverless-приложение глубоко интегрировано с экосистемой провайдера. Lambda + DynamoDB + API Gateway + EventBridge — это не код, который легко перенесёт на другой облако. Lock-in здесь сильнее, чем при использовании контейнеров или классических VM.

Стратегии снижения lock-in

  • Использовать абстракции (Serverless Framework работает с несколькими провайдерами)
  • Изолировать бизнес-логику от провайдер-специфичных интеграций (clean architecture)
  • Использовать open standards (OpenAPI, Kafka, S3-совместимое API)
  • Knative и OpenFaaS как self-hosted альтернативы
  • Acceptence lock-in как осознанный trade-off в обмен на быстроту разработки

Для большинства команд полностью избежать lock-in невозможно. Реалистичный подход — осознанно выбирать, где compromise приемлем, и держать критичные компоненты переносимыми.

Эволюция serverless

Serverless containers

Промежуточная модель между классическим FaaS и контейнерами: AWS Fargate, Google Cloud Run, Azure Container Apps. Запускают контейнеры по запросу с автомасштабированием и оплатой за время выполнения, но без жёстких лимитов FaaS. Подходит для приложений, которые «почти serverless», но требуют больше гибкости.

Serverless databases

Aurora Serverless v2, Neon, PlanetScale, MongoDB Atlas Serverless — БД с автоматическим масштабированием и pay-per-use ценообразованием. Снимают classic-проблему provisioning’а БД-капасити.

Edge functions

Cloudflare Workers, Vercel Edge Functions, Fastly Compute@Edge — выполнение кода на сотнях точек присутствия с латентностью в единицы миллисекунд. Идеально для логики, не требующей доступа к origin-серверу.

Wasm-serverless

WebAssembly как универсальный runtime для serverless. Fermyon Spin, wasmCloud дают альтернативу контейнерам и V8 isolates с лучшей плотностью и portability. Молодое направление, но активно развивается.

Serverless — не серебряная пуля и не повод отказываться от классических архитектур. Это инструмент, который хорошо решает определённые задачи и плохо подходит для других. Сложность в правильном выборе модели для конкретного компонента системы.

Стоимостная модель и FinOps

Pricing FaaS строится на двух осях: количество вызовов и время выполнения с учётом памяти. AWS Lambda берёт $0.20 за миллион запросов и около $0.0000166 за GB-секунду выполнения. На первый взгляд это копейки, но при миллионах запросов в день суммы вырастают быстро.

Антипаттерны в стоимости

  • Функция, опрашивающая БД в цикле миллионы раз вместо одного batch-запроса
  • Чрезмерная гранулярность функций: 50 функций, цепочкой вызывающих друг друга, дороже одной
  • Слишком высокая аллокация памяти: 1024 МБ когда хватает 256 МБ — оплата за неиспользуемое
  • Provisioned concurrency для функций, которые могут жить с cold start
  • Логи в полном объёме в дорогой CloudWatch вместо tiered storage

Часто задаваемые вопросы

Может ли serverless заменить весь backend

Для многих приложений — да. Mobile-backend с типовыми CRUD-операциями, простые SaaS-продукты, маркетинговые сайты, фоновая обработка — всё это можно построить полностью на serverless. Сложные приложения с stateful-компонентами, real-time-функциональностью, высокими нагрузками обычно используют гибрид: serverless для одних частей, classic-инфраструктура для других.

Что с холодным стартом — это реальная проблема

Зависит от сценария. Для пользовательского API с SLO 100 мс — серьёзная проблема, требующая provisioned concurrency или выбора edge-платформ с минимальным cold start. Для фоновых задач, где задержка в секунду не критична — не проблема.

Можно ли использовать serverless для микросервисов

Да, но с осторожностью. Микросервисы на FaaS — это нормально, если они общаются асинхронно через очереди и не образуют синхронных цепочек вызовов. Если 10 функций синхронно вызывают друг друга для обработки одного запроса, latency и стоимость взлетают, и теряются преимущества модели.

Подходит ли serverless для ML-инференса

Для лёгких моделей — да, особенно через специализированные платформы (AWS Lambda с контейнерами, Modal, RunPod). Для тяжёлых моделей с большой памятью или GPU — обычно нет: лимиты FaaS не позволяют, провайдеры медленно добавляют GPU-функции. Альтернатива — serverless containers (Cloud Run) с GPU или managed inference-сервисы.

Как тестировать serverless-приложения

Юнит-тесты — стандартные, с моками AWS SDK или эквивалентов. Интеграционные тесты — через LocalStack для локального запуска AWS-сервисов либо через выделенные тестовые среды в облаке. End-to-end тесты — против реального deployment с очисткой ресурсов после прогона.

Стоит ли переписывать legacy на serverless

Полный refactor — почти всегда плохая идея, дорогой проект с высоким риском провала. Лучший подход — strangler pattern: новые функции пишутся как serverless, старые остаются на classic-инфраструктуре, постепенно мигрируются по мере появления необходимости. Через несколько лет соотношение меняется естественным путём без big-bang переписывания.

Заключение

Serverless — зрелая парадигма развёртывания с собственными преимуществами и ограничениями. Главные преимущества — отсутствие управления инфраструктурой, автоматическое масштабирование, оплата за фактическое использование. Главные ограничения — лимиты выполнения, vendor lock-in, cold start, сложность observability и debugging. Понимание этого баланса определяет, для каких компонентов системы serverless подходит, а для каких — нет.

На практике большинство современных приложений строятся как гибрид: serverless для нерегулярных нагрузок и фоновой обработки, classic-инфраструктура для постоянных высоких нагрузок и stateful-компонентов, edge для латентность-критичной логики. Освоение моделирования архитектуры с учётом сильных и слабых сторон каждой модели — ключевая компетенция современного архитектора. Чисто serverless или чисто container-based решения встречаются всё реже — побеждает прагматичный подход с выбором инструмента под конкретную задачу.