Node.js
Для чего модуль
Освоить Node.js как серверную платформу, а не только как «среду запуска JS»: понимать runtime, проектировать устойчивые API и сопровождать сервис в production.
Результат после прохождения
- Вы объясняете Event Loop и поведение асинхронности в Node без путаницы.
- Вы проектируете API-слой с контрактом ошибок, таймаутами и защитой от деградации.
- Вы понимаете, как работать с памятью, логированием, health-check и graceful shutdown.
- Вы умеете разбирать инциденты через метрики, логи и воспроизводимый runbook.
Термины и аббревиатуры
| Термин | Коротко |
|---|---|
Event Loop | Цикл обработки задач |
Backpressure | Контроль скорости потока |
Idempotency | Безопасный повтор операции |
Readiness | Готовность принимать трафик |
p95/p99 | Хвостовые метрики задержки |
Фокус по грейдам
Junior: понимать базовые механики и объяснять их простыми примерами.Middle: применять тему в продуктовых сценариях с учетом рисков и ограничений.Senior: управлять архитектурными trade-offs, метриками и эволюцией решения.
Как работать с модулем
- Каждый урок связывайте с одним сервисом (реальным или учебным): API + DB + внешняя зависимость.
- Любое решение формулируйте через SLA/SLO и риск-профиль.
- После урока добавляйте минимум один технический артефакт: код, runbook, checklist.
Программа модуля
Урок 1. Runtime и async
Цель: понимать, как Node обрабатывает нагрузку и почему «иногда тормозит».
Event Loop и очередь задач
Ключевые элементы:
- Phases Event Loop (timers, poll, check и т.д.).
- Microtasks queue (
Promisecallbacks). process.nextTickи риск starvation.
I/O-bound vs CPU-bound
Node отлично работает с I/O, но CPU-heavy вычисления могут блокировать loop.
// Плохо: тяжелая синхронная работа в request path
app.get('/report', (req, res) => {
const data = buildHugeReportSync();
res.json(data);
});
Streams и backpressure
Для больших данных используйте stream pipeline, чтобы не раздувать память.
import { pipeline } from 'node:stream/promises';
await pipeline(readable, transform, writable);
Где ломается в проде
- Блокирующие операции в hot-path endpoint.
- Чтение больших файлов/ответов «целиком в память».
- Непонимание разницы
nextTick/setImmediate/setTimeout.
Мини-задача (обязательная)
Сравните два варианта обработки большого файла:
readFile и stream pipeline.
Зафиксируйте разницу по памяти и latency.
Что спросит интервьюер:
почему setImmediate, setTimeout и process.nextTick ведут себя по-разному.
Критерий готовности по уроку: вы можете по симптомам определить, упирается ли сервис в CPU, I/O или архитектурный bottleneck.
Урок 2. Сервисная архитектура API
Цель: построить API-слой, который предсказуем в ошибках и удобен в эксплуатации.
Структура и границы
- Route/controller слой.
- Service/use-case слой.
- Infra layer (DB, внешние API, cache, queue).
Принцип: бизнес-правила не смешиваются с transport/infra кодом.
Error contract
Стабильный контракт снижает время диагностики и улучшает UX.
{
"error": {
"code": "ORDER_CONFLICT",
"message": "Order already confirmed",
"traceId": "f1f5..."
}
}
Таймауты, retry, idempotency
- Таймаут обязателен на внешние вызовы.
- Retry только для транзиентных ошибок и с backoff.
- Для критичных операций используйте idempotency key.
Где ломается в проде
- API возвращает хаотичные форматы ошибок.
- Retry без лимита усиливает деградацию.
- Секреты и конфиги «зашиты» в код/образ.
Мини-задача (обязательная)
Опишите контракт ошибок для 5 типовых сценариев: валидация, auth, conflict, external timeout, unknown error.
Что спросит интервьюер: как вы отделяете бизнес-ошибки от инфраструктурных.
Критерий готовности по уроку: вы можете показать API-контур, в котором ошибки и таймауты контролируются, а не «случайны».
Урок 3. Надежность под нагрузкой
Цель: проектировать сервис так, чтобы он деградировал контролируемо, а не падал каскадно.
Protection patterns
- Rate limiting и throttling.
- Queue/buffer для всплесков нагрузки.
- Circuit breaker и bulkhead-подход.
Worker threads и cluster
worker_threads— для CPU-bound задач.cluster/multi-process — масштабирование по ядрам и отказоустойчивость процесса.
Cache и consistency trade-offs
- Кэш снижает latency, но может отдавать stale данные.
- Нужна стратегия invalidation и fallback на cache miss.
- Hot key и cache stampede должны быть предусмотрены.
Где ломается в проде
- Нет лимитов на дорогие endpoint.
- Очередь не ограничена и становится «черной дырой».
- Нет плана деградации при отказе внешнего сервиса.
Мини-задача (обязательная)
Подготовьте план защиты endpoint при росте трафика x10: лимиты, деградация ответа, очереди, алерты, rollback критерии.
Что спросит интервьюер: что вы будете делать первым делом при росте p95 latency.
Критерий готовности по уроку: вы можете описать надежностный контур сервиса и объяснить, как он ведет себя при отказах.
Урок 4. Эксплуатация
Цель: сопровождать Node-сервис в проде как инженерную систему.
Наблюдаемость
- Structured logs (JSON) с
traceId/requestId. - Метрики: latency, error rate, saturation.
- Health/readiness probes.
Память и диагностика
- Разница между heap leak и внешним ростом памяти.
- Heap snapshots и профилирование.
- Корреляция роста памяти с конкретными сценариями нагрузки.
Graceful shutdown и релизы
- Перестать принимать новый трафик.
- Дождаться завершения in-flight запросов.
- Закрыть соединения к DB/queue/cache.
Где ломается в проде
- Rollout без readiness checks.
- Логи без корреляции, невозможно собрать таймлайн инцидента.
- При рестарте теряются in-flight операции.
Мини-задача (обязательная)
Соберите post-release checklist и incident runbook: что проверяем в первые 30 минут после релиза и при каких условиях откатываемся.
Что спросит интервьюер: как вы расследуете утечку памяти в живом сервисе.
Критерий готовности по уроку: вы можете провести расследование инцидента от симптома до root cause и описать превентивные меры.
Практика
- Пройдите Node.js вопросы.
- Реализуйте API endpoint с timeout, retry guard, idempotency и единым error contract.
- Добавьте
health,readiness, structured logging и correlation id. - Смоделируйте нагрузку и зафиксируйте поведение p95/p99 до и после оптимизаций.
- Подготовьте инцидентный runbook для кейса «рост latency + рост ошибок внешнего API».
- Смоделируйте деградацию внешнего API в Песочнице и прогоните runbook восстановления.
Связь с треками и вопросами
- Треки: Middle трек, Senior трек.
- Вопросы: Node.js, NestJS, Базы данных.
- Повторение: 3-5 вопросов без подсказок -> сверка с модулем -> повтор через 24 часа.
Критерий готовности
Вы объясняете Node-сервис как production-систему: архитектура, защита от деградации, эксплуатация, инцидентная диагностика.
Артефакты после модуля
- Runbook деградации API (симптомы, проверка, действия).
- Шаблон error contract и policy таймаутов/retry.
- Release checklist + rollback критерии.
- Набор из 6 сильных interview-ответов по Node.js.