Serverless и FaaS в Node.js

FaaS (AWS Lambda, Vercel, Cloud Functions) перечёркивает главные преимущества Node — долгоживущий процесс с состоянием и долгие соединения. Применять осознанно.

Суть

В Node.js процесс живёт часами/днями, хранит кеш, держит keep-alive соединения с БД, обрабатывает 10–50k req/s. Serverless поднимает функцию на каждый запрос (или пачку), кеш стирается, БД-соединение пересоздаётся, холодный старт 100–2000 мс.

Зачем тогда serverless

  • Нерегулярная нагрузка — 100 запросов в день, держать сервер невыгодно
  • Burst-нагрузка — пик 1000 req/s 1 раз в час, остальное время 0
  • Time-to-market — не нужно ставить инфру, deploy одной командой
  • Geo-распределение — Edge Functions в CDN

Когда serverless дороже и хуже

  • Постоянная нагрузка — в 5–500 раз дороже dedicated сервера
  • Длинные соединения (WebSocket, SSE, long-poll) — провайдер не даст
  • Стейт между запросами — сессии, кеш — некуда положить (только во внешний Redis = +latency)
  • Холодный старт в hot path — критично для UX

Изоляция запросов без FaaS

Если нужна изоляция per-request (защита от утечки данных между юзерами) — есть варианты в обычной ноде:

// 1. AsyncLocalStorage — изолированный контекст на async chain
const { AsyncLocalStorage } = require('async_hooks');
const als = new AsyncLocalStorage();

app.use((req, res, next) => {
  als.run({ userId: req.user.id, traceId: req.id }, () => next);
});
// Внутри любого async-вызова: als.getStore вернёт правильный context

// 2. vm.createContext — каждый запрос в своей песочнице
// 3. Worker threads — изолированный JS-движок на запрос
// 4. Cluster — процесс на ядро (но не на запрос)

Что нельзя отдать провайдеру

  • Криптографические ключи приложения
  • Бизнес-логика расчёта цен/скидок
  • Кастомные протоколы поверх TCP/UDP
  • Логика, требующая sticky-сессий

Подводные камни

  • Холодный старт: первый запрос медленный, особенно если код тяжёлый. Bundle через esbuild, минимизируй зависимости
  • Платёжный сюрприз: ошибка/loop в Lambda = бесконечные вызовы = большой счёт
  • Скрытые платежи: API Gateway, NAT Gateway, исходящий трафик — часто больше чем сами вычисления
  • Vendor lock-in: API Lambda ≠ Cloud Functions ≠ Azure — мигрировать тяжело
  • Отладка сложнее: distributed tracing, локальный запуск — отдельная боль

🎓 Источники

  • 🎓 [Serverless Clouds (FaaS) и изоляция контекстов запросов] · 2019-12-05 · YouTube · [Marp](../../../Documents/TimurShemsedinov/2019-12-05 — 💻 Serverless Clouds (FaaS) и изоляция контекстов запросов в Node.js (x-Rd6fPV6L8).md)
    • Тезисы: FaaS перечёркивает суть Node, экономия 9 из 10$ — байки, в 500 раз дороже на постоянной нагрузке, vendor lock, скрытые платежи за gateway, эффективно только для маленьких/нерегулярных задач, изоляция через vm.createContext или AsyncLocalStorage внутри одного процесса
    • Цитата: «Долгоживущий процесс с состоянием — главная сила Node. FaaS её выбрасывает»

См. также