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-слой, который предсказуем в ошибках и удобен в эксплуатации.