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 её выбрасывает»