Бэкенд-разработчик Node. js (Профессиональный уровень)

Курс «Бэкенд-разработчик Node.js (Профессиональный уровень)» даст вам углубленные знания и практические навыки разработки серверных приложений. Вы изучите асинхронное программирование, REST и GraphQL API, работу с базами данных, микросервисы, Docker, CI/CD, тестирование и деплой. Курс ориентирован на опытных разработчиков, желающих выйти на новый уровень в backend-разработке на Node.js.

Курс охватывает углублённое изучение backend-разработки с использованием Node.js. Слушатели освоят асинхронное программирование, работу с Express и NestJS, REST и GraphQL API, интеграцию с PostgreSQL, MongoDB, Redis, настройку аутентификации и авторизации (JWT, OAuth), тестирование (Jest, Supertest), работу с Docker, CI/CD, микросервисную архитектуру и деплой в облаке (AWS, Heroku, Kubernetes).

 

Ожидаемые результаты после прохождения курса:
Слушатель должен уметь:

  • Разрабатывать высокопроизводительные и масштабируемые backend-приложения на Node.js
  • Проектировать и реализовывать API по стандартам REST и GraphQL
  • Интегрировать приложения с реляционными и NoSQL базами данных
  • Писать unit и интеграционные тесты
  • Использовать контейнеризацию и автоматизировать деплой
  • Применять паттерны проектирования и best practices backend-разработки
 

Слушатель должен знать:

  • Принципы асинхронного и событийно-ориентированного программирования в Node.js
  • Архитектурные подходы к построению серверных приложений
  • Механизмы безопасности для web-сервисов
  • Основы работы с HTTP(S), TCP/IP, веб-сокетами
  • Инструменты мониторинга, логгирования и оптимизации производительности
  1. Что такое Node.js и какова его основная архитектура?
    Node.js — это среда выполнения JavaScript на стороне сервера, основанная на движке V8 от Google. Его архитектура построена на событийно-ориентированной, неблокирующей модели ввода-вывода, что делает его легковесным и эффективным для масштабируемых сетевых приложений.

  2. Как работает Event Loop в Node.js?
    Event Loop — это механизм обработки асинхронных операций в Node.js. Он состоит из нескольких фаз: timers, pending callbacks, idle/prepare, poll, check, close callbacks. Основная цель — обрабатывать события и выполнять callback-функции в правильном порядке, обеспечивая высокую производительность.

  3. В чём разница между CommonJS и ECMAScript Modules (ESM) в Node.js?
    CommonJS — это стандарт модульной системы, используемый в Node.js до появления ESM. Импорты в CommonJS синхронны и используют require()ESM — это стандартизированный способ импорта через importподдерживающий асинхронную загрузку и более гибкую структуру.

  4. Что такое Stream и какие типы потоков существуют в Node.js?
    Stream — это абстрактный интерфейс для работы с потоками данных. Типы: Readable (чтение), Writable (запись), Duplex (чтение и запись), Transform (Duplex, изменяющий данные при передаче).

  5. Как реализуется работа с файловой системой в Node.js?
    Для работы с файлами используется модуль fsОн предоставляет синхронные и асинхронные методы чтения, записи, удаления, копирования файлов и управления директориями.

  6. Что такое Buffer и зачем он нужен в Node.js?
    Buffer — это класс, позволяющий работать с бинарными данными напрямую. Он используется для обработки потоков, сетевых запросов, файлов и других случаев, где требуется манипуляция сырыми данными вне контекста строк.

  7. Какие HTTP-методы вы знаете и когда они применяются?
    GET — получение данных, POST — создание ресурса, PUT/PATCH — обновление, DELETE — удаление. В REST API эти методы определяют тип операции над ресурсом.

  8. Что такое Express.js и как он устроен?
    Express — это минимальный веб-фреймворк для Node.js. Он предоставляет маршрутизацию, middleware, обработку запросов и ответов. Основные элементы: app, router, middleware, route handlers.

  9. Как работают middleware в Express?
    Middleware — это функция, которая имеет доступ к объектам reqresи следующей middlewarenextОни используются для логики, проверки, изменения запросов или ответов, и последовательного выполнения действий.

  10. Что такое REST API и как его строить в Node.js?
    REST API — это стиль архитектуры, основанный на HTTP-методах и ресурсоориентированной структуре. В Node.js REST API строится с помощью Express или NestJS, с применением маршрутов, контроллеров и сервисов.

  11. Что такое GraphQL и чем он отличается от REST?
    GraphQL — это язык запросов и серверная технология, позволяющая клиенту точно указывать, какие данные ему нужны. В отличие от REST, он позволяет запрашивать несколько ресурсов за один вызов и снижает количество лишних данных.

  12. Как организовать работу с базой данных в Node.js?
    Можно использовать ORM (Sequelize, TypeORM, Mongoose) или сырые SQL-запросы. Также применяются пул соединений, транзакции, миграции и сиды для контроля состояния БД.

  13. Как подключить PostgreSQL к Node.js приложению?
    С помощью драйвера pg или ORM, такой как Sequelize. Подключение выполняется через URI или объект конфигурации с хостом, портом, пользователем, паролем и именем БД.

  14. Что такое JWT и как он используется в Node.js?
    JWT (JSON Web Token) — это стандарт для передачи данных между клиентом и сервером в виде подписанных JSON-токенов. Используется для аутентификации и авторизации.

  15. Как защититься от SQL-инъекций в Node.js?
    Использовать параметризованные запросы, ORM, либо библиотеки вроде sql-template-stringsЭто предотвращает выполнение вредоносного SQL-кода.

  16. Как реализовать тестирование в Node.js приложениях?
    Тестирование проводится с использованием Jest, Mocha, Chai, Supertest. Пишутся unit-тесты, интеграционные тесты, тесты API, mock-объекты и спай-функции.

  17. Что такое Docker и как его использовать в Node.js проектах?
    Docker — это платформа для создания, запуска и управления контейнерами. В Node.js он применяется для изолированного запуска приложений, зависимостей, БД и CI/CD.

  18. Как настроить CI/CD для Node.js приложения?
    CI/CD настраивается через GitHub Actions, GitLab CI, Jenkins. Процесс включает автоматический запуск тестов, сборку образов, деплой на staging/production окружения.

  19. Что такое микросервисная архитектура и как её реализовать на Node.js?
    Микросервисная архитектура — это подход, при котором приложение состоит из множества независимых сервисов. Реализация в Node.js возможна через отдельные сервисы на Express/NestJS, связанные через REST/gRPC/сообщения.

  20. Как работает кэширование в Node.js и какие инструменты для этого используются?
    Кэширование реализуется через Redis, Memcached или in-memory cache. Применяется для временного хранения результатов частых запросов, снижая нагрузку на БД.

  21. Что такое WebSockets и как их реализовать в Node.js?
    WebSockets — это протокол двусторонней связи между клиентом и сервером. В Node.js реализуется через библиотеки ws или socket.io

  22. Как организовать логирование в Node.js приложении?
    Логирование осуществляется с помощью winstonbunyanpinoЛоги можно отправлять в файлы, консоль, ELK, Sentry, Datadog для анализа и мониторинга.

  23. Как повысить производительность Node.js приложения?
    Оптимизация включает использование кэша, пулов подключений, профилирования с помощью node --inspectминимизацию блокирующих операций, использование кластеризации через cluster

  24. Как реализовать аутентификацию через OAuth 2.0 в Node.js?
    Аутентификация через OAuth 2.0 реализуется с помощью Passport.js или вручную. Используется для входа через сторонние сервисы (Google, GitHub и т.д.).

  25. Как деплоить Node.js приложение на AWS?
    Деплой возможен через EC2, Elastic Beanstalk, Lambda, ECS. Также используется инфраструктура как код (Terraform, CloudFormation), контейнеризация и автоматизация через CI/CD.

  1. Что такое N-API и зачем он используется в Node.js?
    N-API — это API, предоставляемый Node.js для создания нативных надстроек. Он абстрагирует внутренние детали движка V8, обеспечивая стабильность между версиями Node.js и совместимость с разными JavaScript-движками.

  2. Как работает система модулей в Node.js?
    Node.js использует CommonJS по умолчанию. Модуль загружается через require()экспортируется через module.exportsКаждый файл считается отдельным модулем с ограниченной областью видимости.

  3. Что такое Cluster module и как он помогает в Node.js?
    Cluster — это встроенный модуль, позволяющий создавать дочерние процессы (forks), использующие один порт. Это позволяет задействовать несколько ядер процессора и повышает производительность приложения.

  4. Как реализовать rate limiting в Node.js приложении?
    Rate limiting ограничивает количество запросов от пользователя за определённый период. Реализуется через middleware (например, express-rate-limitили Redis для хранения счетчиков.

  5. Что такое Web Workers в Node.js и когда их использовать?
    Web Workers — это потоки выполнения, которые позволяют выполнять тяжёлые вычисления вне основного event loop. Используются для CPU-bound задач, чтобы не блокировать основной поток.

  6. Как организовать работу с очередями задач в Node.js?
    Для работы с асинхронными задачами и очередями используются библиотеки типа bullagenda или интеграция с RabbitMQ, Kafka. Это позволяет обрабатывать фоновые операции: отправка email, обработка изображений и т.д.

  7. Что такое паттерн Middleware в контексте Node.js?
    Middleware — это функция, которая может читать и изменять входящие HTTP-запросы и исходящие ответы перед тем, как будет отправлен окончательный ответ. Применяется для логирования, проверки прав, обработки ошибок и других задач.

  8. Как реализовать миграции баз данных в Node.js проекте?
    Миграции создаются с помощью инструментов, таких как knextypeormsequelize-cliОни позволяют отслеживать изменения схемы БД и применять их последовательно в разных окружениях.

  9. В чём разница между callback, Promise и async/await в Node.js?
    Callback — старый способ обработки асинхронности, ведущий к "callback hell". Promise — более современный подход с цепочками .then() и .catch()Async/await — синтаксический сахар над Promise, упрощающий написание асинхронного кода.

  10. Как настроить HTTPS-сервер в Node.js?
    HTTPS-сервер создаётся с использованием модуля https и приватного ключа с сертификатом. Сертификат может быть самоподписанным или полученным от CA (Let’s Encrypt).

  11. Что такое CORS и как его настроить в Express?
    CORS — механизм, позволяющий серверу разрешать запросы из другого домена. В Express настраивается через middleware corsгде указываются разрешённые origin, headers и методы.

  12. Как организовать работу с cookies в Node.js?
    Cookies управляются через объект req.cookiesпосле подключения cookie-parserи res.cookie() для установки. Также можно работать напрямую через заголовок Set-Cookie

  13. Что такое сериализация и десериализация данных в Node.js?
    Сериализация — преобразование объекта в строку (JSON.stringify), десериализация — обратное преобразование (JSON.parse). Широко применяется при работе с API, кэшированием и хранением данных.

  14. Как использовать environment variables в Node.js?
    Environment variables загружаются через process.envДля удобства часто используется библиотека dotenvкоторая считывает значения из файла .env

  15. Что такое graceful shutdown в Node.js и как его реализовать?
    Graceful shutdown — корректное завершение работы приложения с завершением всех текущих операций. Реализуется через обработчики событий SIGTERMSIGINTзакрытие соединений с БД и сервера.

  16. Как реализовать пагинацию в REST API на Node.js?
    Пагинация реализуется через параметры limit и offset или page и pageSize в query-параметрах. На стороне сервера формируется SQL-запрос с LIMIT и OFFSET

  17. Что такое OpenAPI и как его использовать в Node.js?
    OpenAPI — спецификация описания REST API. В Node.js применяется вместе с инструментами вроде Swagger UIswagger-jsdocswagger-ui-expressдля автоматической генерации документации.

  18. Как реализовать фильтрацию, сортировку и поиск в API на Node.js?
    Фильтрация — через query-параметры filter[name]=JohnСортировка — через sort=+name или -nameПоиск — через full-text search в БД или фильтрацию на уровне приложения.

  19. Что такое dependency injection и как её реализовать в Node.js?
    Dependency Injection (DI) — паттерн, позволяющий внедрять зависимости в классы или функции. В Node.js DI реализуется вручную или с помощью NestJS, который имеет встроенную систему DI.

  20. Как реализовать обработку загрузки файлов в Node.js?
    Загрузка файлов реализуется с помощью multer (для multipart/form-data), busboyили вручную через потоки. Файлы могут сохраняться на диск или в облачное хранилище (AWS S3, Firebase Storage).

  21. Что такое observability и какие инструменты используются в Node.js?
    Observability — это возможность понимать состояние системы через логи, метрики и трейсы. Инструменты: Prometheus, Grafana, Sentry, Datadog, OpenTelemetry.

  22. Как использовать WebAssembly в Node.js?
    WebAssembly (Wasm) позволяет запускать высокоэффективный код из других языков (Rust, C++). В Node.js Wasm загружается через WebAssembly.compile() и WebAssembly.instantiate()

  23. Как организовать работу с шаблонизаторами в Node.js?
    Для рендеринга HTML используются шаблонизаторы: EJS, Pug, Handlebars. Подключаются через соответствующие middleware и engine-модули, чаще всего в связке с Express.

  24. Что такое health check и как его реализовать в Node.js?
    Health check — это эндпоинт, который показывает состояние сервиса. Реализуется простым GET-маршрутом, проверяющим доступность БД, внешних сервисов и возвращаемым JSON-ответом.

  25. Как реализовать rate throttling и circuit breaker в Node.js микросервисах?
    Rate throttling — через Redis и middleware. Circuit breaker — через библиотеки вроде opossum или hystrixjsкоторые предотвращают падение системы при отказе одного из сервисов.

  1. Что такое Node.js Addons и как их использовать?
    Node.js Addons — это модули, написанные на C или C++, которые расширяют функциональность Node.js. Они используют N-API для взаимодействия с JavaScript и применяются для высокопроизводительных задач.

  2. Как реализовать асинхронную валидацию данных в Node.js?
    Асинхронная валидация выполняется через промисы или async/await, например, при проверке уникальности email в БД. Используются библиотеки вроде joi или кастомные функции с запросами к базе.

  3. В чём разница между microservices и monolithic архитектурой в контексте Node.js?
    Monolith — единое приложение, где все компоненты тесно связаны. Microservices — набор независимых сервисов, общающихся по сети. В Node.js микросервисы реализуются отдельными Express/NestJS-приложениями.

  4. Как использовать Redis в качестве брокера сообщений в Node.js?
    Redis поддерживает pub/sub модель. Через redis.createClient() создаются клиенты, подписка через subscribe()публикация — через publish()Применяется для межсервисного общения.

  5. Что такое graceful degradation и как её обеспечить в Node.js?
    Graceful degradation — поведение приложения при частичном отказе. Реализуется через fallback-логику, кэширование, резервные источники данных и корректную обработку ошибок.

  6. Как организовать работу с gRPC в Node.js?
    gRPC — это RPC-фреймворк, основанный на протобуфах. В Node.js используется @grpc/grpc-jsгде описывается .proto-файл, генерируются stub'ы, и создаются клиент и сервер.

  7. Какие подходы к логированию ошибок вы знаете в Node.js?
    Использование winstonpinoотправка ошибок в Sentry, Datadog, использование уровней логирования (error, warn, info), структурированный вывод и хранение логов в ELK-стеке.

  8. Что такое circuit breaker и как его реализовать в Node.js?
    Circuit breaker — паттерн, предотвращающий каскадный отказ. Реализуется через библиотеки типа opossum или resilientкоторые отслеживают количество ошибок и временно блокируют вызовы.

  9. Как работать с HTTP/2 в Node.js?
    HTTP/2 поддерживается через модуль http2Требует TLS-сертификата, поддержки ALPN. Позволяет ускорить загрузку за счёт мультиплексирования запросов.

  10. Что такое API Gateway и как он может быть реализован в Node.js?
    API Gateway — точка входа, маршрутизирующая запросы к микросервисам. Реализуется через Express, NestJS, Kong, Tyk или AWS API Gateway.

  11. Как реализовать rate limiting на уровне сети в Node.js микросервисах?
    Rate limiting на уровне сети можно реализовать через Envoy Proxy, Nginx или Istio. Также возможна интеграция с Redis для централизованного учёта запросов.

  12. Что такое service discovery и как его использовать в Node.js?
    Service discovery — механизм поиска доступных сервисов. В Node.js используется HashiCorp Consul, etcd, Zookeeper или Kubernetes endpoints для автоматического обнаружения сервисов.

  13. Как реализовать шифрование данных в Node.js?
    Шифрование реализуется через модуль cryptoПоддерживаются алгоритмы AES, RSA, SHA. Используется для безопасного хранения паролей (bcrypt), передачи данных и подписи токенов.

  14. Что такое tracing и какие инструменты используются в Node.js?
    Tracing — это отслеживание пути запроса через микросервисы. Инструменты: OpenTelemetry, Jaeger, Datadog APM, Zipkin. Используется для анализа производительности и диагностики проблем.

  15. Как использовать Web Workers в связке с Express?
    Web Workers позволяют выполнять CPU-интенсивные задачи в фоновых потоках. В связке с Express они могут использоваться для обработки изображений, машинного обучения, генерации отчётов и т. д.

  16. Как реализовать custom error handling в Node.js?
    Кастомные ошибки создаются через классы, наследующие ErrorОбработка осуществляется middleware, который перехватывает ошибки и возвращает унифицированный ответ клиенту.

  17. Что такое idempotency и как её реализовать в REST API на Node.js?
    Idempotency — свойство операции давать одинаковый результат при повторных вызовах. Реализуется через идемпотентные ключи, запись состояния в БД или Redis.

  18. Как реализовать batch processing в Node.js?
    Batch processing — выполнение множества задач группами. Используются потоки, очереди (bullkafkaи планировщикиagendacronПолезно для массовой отправки email, обработки логов.

  19. Как использовать Node.js в связке с Kafka?
    Kafka — платформа потоковой обработки. В Node.js используется библиотека kafkajs для создания producer, consumer, обработки событий и управления топиками.

  20. Что такое observability и как она отличается от monitoring в Node.js?
    Monitoring — сбор метрик и алертов. Observability — глубокое понимание внутреннего состояния системы через логи, метрики и трейсы. Monitoring — часть observability.

  21. Как реализовать retry logic в Node.js?
    Retry logic — повтор запроса при неудаче. Реализуется через библиотекиasync-retryp-retryили вручную с экспоненциальным backoff и ограничением попыток.

  22. Как использовать Node.js в serverless архитектуре?
    Node.js активно используется в serverless (AWS Lambda, Azure Functions). Приложения пишутся как stateless функции, запускаемые по событиям. Оптимизация важна из-за холодного старта.

  23. Что такое distributed tracing и как его настроить в Node.js?
    Distributed tracing — отслеживание запроса через несколько сервисов. Настройка через OpenTelemetry, Jaeger, Zipkin. Добавляются trace ID и span ID в заголовки HTTP-запросов.

  24. Как использовать Node.js вместе с PostgreSQL через TypeORM?
    TypeORM — ORM, поддерживающая декларативную работу с БД. Создаются entities, repositories, migrations. Подключение через DataSourceзапросы строятся через QueryBuilder или entity manager.

  25. Как организовать работу с gRPC streaming в Node.js?
    gRPC поддерживает четыре типа вызовов: unary, server streaming, client streaming, bidirectional streaming. В Node.js реализуются через call.write()call.on('data')и другие методы потокового API.

  1. Какой модуль в Node.js используется для работы с файловой системой?
    A) http
    B) fs
    C) os
    D) path
    Правильный ответ: B) fs

  2. Что такое Event Loop в Node.js?
    A) Механизм синхронного выполнения кода
    B) Цикл обработки асинхронных операций
    C) Система управления памятью
    D) Фреймворк для маршрутизации
    Правильный ответ: B) Цикл обработки асинхронных операций

  3. Какой HTTP-метод обычно используется для создания ресурса на сервере?
    A) GET
    B) POST
    C) PUT
    D) DELETE
    Правильный ответ: B) POST

  4. Какой из следующих типов потоков позволяет одновременно читать и записывать данные?
    A) Readable
    B) Writable
    C) Duplex
    D) Transform
    Правильный ответ: C) Duplex

  5. Что делает функция module.exports в Node.js?
    A) Импортирует модуль
    B) Экспортирует функционал модуля
    C) Удаляет модуль
    D) Перезагружает модуль
    Правильный ответ: B) Экспортирует функционал модуля

  6. Какой из следующих фреймворков является наиболее популярным для построения REST API в Node.js?
    A) React
    B) Express
    C) Angular
    D) Vue
    Правильный ответ: B) Express

  7. Какой метод в Express используется для определения middleware?
    A) app.use()
    B) app.get()
    C) app.post()
    D) app.set()
    Правильный ответ: A) app.use()

  8. Какой формат данных чаще всего используется при обмене данными между клиентом и сервером в REST API?
    A) XML
    B) CSV
    C) JSON
    D) HTML
    Правильный ответ: C) JSON

  9. Что означает аббревиатура JWT?
    A) JavaScript Web Token
    B) Java Web Template
    C) JSON Web Token
    D) JavaScript Worker Thread
    Правильный ответ: C) JSON Web Token

  10. Какой инструмент используется для контейнеризации Node.js приложений?
    A) Nginx
    B) Docker
    C) NPM
    D) Webpack
    Правильный ответ: B) Docker

  11. Какой из следующих вариантов не является частью жизненного цикла HTTP-запроса в Node.js?
    A) Открытие соединения
    B) Обработка запроса
    C) Генерация ответа
    D) Компиляция CSS
    Правильный ответ: D) Компиляция CSS

  12. Какая библиотека часто используется для тестирования Node.js приложений?
    A) Mocha
    B) Webpack
    C) Babel
    D) ESLint
    Правильный ответ: A) Mocha

  13. Какой из следующих принципов лучше всего описывает подход REST?
    A) Состояние клиента хранится на сервере
    B) Клиент-серверная архитектура без сохранения состояния
    C) Все данные передаются в виде XML
    D) Сервер должен управлять сессиями
    Правильный ответ: B) Клиент-серверная архитектура без сохранения состояния

  14. Какой из следующих модулей является встроенным в Node.js?
    A) axios
    B) express
    C) fs
    D) mongoose
    Правильный ответ: C) fs

  15. Какой тип базы данных лучше всего подходит для работы с JSON в Node.js?
    A) Реляционная (PostgreSQL)
    B) NoSQL (MongoDB)
    C) Графовая (Neo4j)
    D) Временная (Redis)
    Правильный ответ: B) NoSQL (MongoDB)

  16. Какой из следующих методов Node.js используется для чтения содержимого директории?
    A) fs.readFile()
    B) fs.readdir()
    C) fs.writeFile()
    D) fs.unlink()
    Правильный ответ: B) fs.readdir()

  17. Что такое callback-функция в Node.js?
    A) Синхронная функция
    B) Функция, вызываемая после завершения асинхронной операции
    C) Функция, запускаемая до начала программы
    D) Функция, всегда возвращающая true
    Правильный ответ: B) Функция, вызываемая после завершения асинхронной операции

  18. Какой из следующих объектов в Express содержит параметры строки запроса?
    A) req.body
    B) req.params
    C) req.query
    D) req.headers
    Правильный ответ: C) req.query

  19. Какое из следующих утверждений верно относительно async/await в Node.js?
    A) Может использоваться только в классах
    B) Требует использования .then() и .catch()
    C) Является синтаксическим сахаром над Promise
    D) Не поддерживается в современных версиях Node.js
    Правильный ответ: C) Является синтаксическим сахаром над Promise

  20. Какой из следующих терминов описывает использование нескольких независимых сервисов вместо одного монолита?
    A) MVC
    B) Microservices
    C) ORM
    D) REST
    Правильный ответ: B) Microservices

  21. Какой из следующих инструментов используется для управления зависимостями в Node.js проектах?
    A) npm
    B) webpack
    C) eslint
    D) jest
    Правильный ответ: A) npm

  22. Какой HTTP-статус код указывает на успешное выполнение запроса?
    A) 200
    B) 301
    C) 404
    D) 500
    Правильный ответ: A) 200

  23. Какой из следующих типов кэширования лучше всего подходит для временного хранения данных в Node.js?
    A) CDN
    B) Redis
    C) Browser cache
    D) LocalStorage
    Правильный ответ: B) Redis

  24. Какой из следующих методов используется для отправки HTTP-запросов из Node.js приложения?
    A) fs.createReadStream()
    B) http.request()
    C) path.join()
    D) os.platform()
    Правильный ответ: B) http.request()

  25. Какой из следующих инструментов может использоваться для автоматического деплоя Node.js приложений?
    A) Git
    B) GitHub Actions
    C) Chrome DevTools
    D) Figma
    Правильный ответ: B) GitHub Actions

  1. Какой из следующих модулей в Node.js используется для работы с путями файловой системы?
    A) fs
    B) os
    C) path
    D) stream
    Правильный ответ: C) path

  2. Что означает термин "асинхронность" в контексте Node.js?
    A) Последовательное выполнение кода
    B) Выполнение кода без блокировки основного потока
    C) Компиляция кода до запуска
    D) Работа только с синхронными функциями
    Правильный ответ: B) Выполнение кода без блокировки основного потока

  3. Какой из следующих типов потоков позволяет изменять данные при передаче?
    A) Readable
    B) Writable
    C) Duplex
    D) Transform
    Правильный ответ: D) Transform

  4. Какой HTTP-метод обычно используется для частичного обновления ресурса?
    A) POST
    B) PUT
    C) PATCH
    D) DELETE
    Правильный ответ: C) PATCH

  5. Какой из следующих механизмов используется для хранения сессий в Node.js?
    A) req.query
    B) req.params
    C) req.session
    D) req.headers
    Правильный ответ: C) req.session

  6. Какое событие генерируется при ошибке в потоках (Stream) Node.js?
    A) 'data'
    B) 'end'
    C) 'error'
    D) 'close'
    Правильный ответ: C) 'error'

  7. Какой из следующих инструментов не является тестовым фреймворком для Node.js?
    A) Jest
    B) Mocha
    C) Webpack
    D) Ava
    Правильный ответ: C) Webpack

  8. Какой из следующих методов Express используется для определения middleware?
    A) app.use()
    B) app.get()
    C) app.post()
    D) app.set()
    Правильный ответ: A) app.use()

  9. Какой из следующих подходов используется для ограничения количества запросов от одного клиента?
    A) JWT
    B) Rate limiting
    C) CORS
    D) Helmet
    Правильный ответ: B) Rate limiting

  10. Какой из следующих типов БД лучше всего подходит для горизонтального масштабирования в Node.js?
    A) Реляционная (MySQL)
    B) NoSQL (MongoDB)
    C) Орелациональная (PostgreSQL)
    D) In-memory (SQLite)
    Правильный ответ: B) NoSQL (MongoDB)

  11. Какой из следующих пакетов используется для валидации данных в Node.js?
    A) bcrypt
    B) joi
    C) uuid
    D) dotenv
    Правильный ответ: B) joi

  12. Какой из следующих заголовков HTTP используется сервером для отправки cookie клиенту?
    A) Cookie
    B) Set-Cookie
    C) Authorization
    D) Content-Type
    Правильный ответ: B) Set-Cookie

  13. Какой из следующих инструментов может использоваться для управления версиями API в Node.js?
    A) Swagger
    B) Accept header
    C) Cookie
    D) JWT
    Правильный ответ: B) Accept header

  14. Какой из следующих методов позволяет установить соединение с базой данных PostgreSQL в Node.js?
    A) pool.query()
    B) client.connect()
    C) db.init()
    D) sequelize.sync()
    Правильный ответ: B) client.connect()

  15. Какой из следующих протоколов поддерживает мультиплексирование запросов по одному соединению?
    A) HTTP/1.1
    B) HTTP/2
    C) FTP
    D) TCP
    Правильный ответ: B) HTTP/2

  16. Какой из следующих фреймворков предоставляет готовую систему dependency injection и модульности?
    A) Express
    B) Fastify
    C) NestJS
    D) Koa
    Правильный ответ: C) NestJS

  17. Какой из следующих механизмов обеспечивает безопасное хранение секретов (токенов, паролей) в Node.js приложении?
    A) .env файлы
    B) Environment variables
    C) Vault системы
    D) Все вышеперечисленное
    Правильный ответ: D) Все вышеперечисленное

  18. Какой из следующих терминов описывает ситуацию, когда одно приложение использует слишком много ресурсов и мешает другим?
    A) Bottleneck
    B) Resource starvation
    C) Deadlock
    D) Race condition
    Правильный ответ: B) Resource starvation

  19. Какой из следующих механизмов позволяет Node.js обрабатывать параллельные задачи без блокировок?
    A) Event Loop
    B) Garbage Collector
    C) Thread Pool
    D) V8 Engine
    Правильный ответ: A) Event Loop

  20. Какой из следующих типов тестов проверяет поведение отдельной функции или модуля изолированно?
    A) Unit-тесты
    B) Интеграционные тесты
    C) End-to-end тесты
    D) Acceptance тесты
    Правильный ответ: A) Unit-тесты

  21. Какой из следующих терминов описывает использование одного и того же кода в нескольких частях приложения?
    A) DRY (Don’t Repeat Yourself)
    B) KISS (Keep It Simple, Stupid)
    C) YAGNI (You Ain't Gonna Need It)
    D) SOLID
    Правильный ответ: A) DRY (Don’t Repeat Yourself)

  22. Какой из следующих инструментов используется для документирования REST API в Node.js?
    A) Swagger/OpenAPI
    B) ESLint
    C) Prettier
    D) Mocha
    Правильный ответ: A) Swagger/OpenAPI

  23. Какой из следующих инструментов может использоваться для автоматизации сборки и деплоя Node.js приложений?
    A) Docker
    B) CI/CD pipelines
    C) Webpack
    D) Babel
    Правильный ответ: B) CI/CD pipelines

  24. Какой из следующих терминов описывает способность системы обрабатывать увеличивающуюся нагрузку за счёт добавления ресурсов?
    A) Availability
    B) Fault tolerance
    C) Scalability
    D) Maintainability
    Правильный ответ: C) Scalability

  25. Какой из следующих механизмов позволяет передавать данные между микросервисами в Node.js?
    A) REST API
    B) gRPC
    C) Message brokers
    D) Все вышеперечисленное
    Правильный ответ: D) Все вышеперечисленное

  1. Какой из следующих модулей в Node.js используется для работы с шифрованием данных?
    A) fs
    B) os
    C) crypto
    D) path
    Правильный ответ: C) crypto

  2. Что такое "callback hell" в Node.js?
    A) Высокая производительность приложения
    B) Сложночитаемый код с вложенными callback-функциями
    C) Ошибка компиляции
    D) Несовместимость версий Node.js
    Правильный ответ: B) Сложночитаемый код с вложенными callback-функциями

  3. Какой HTTP-метод обычно используется для частичного обновления ресурса?
    A) POST
    B) PUT
    C) PATCH
    D) DELETE
    Правильный ответ: C) PATCH

  4. Какой тип middleware в Express вызывается всегда, независимо от маршрута?
    A) Route-specific middleware
    B) Application-level middleware
    C) Error-handling middleware
    D) Global middleware
    Правильный ответ: D) Global middleware

  5. Какой из следующих инструментов не используется для управления зависимостями в Node.js?
    A) npm
    B) yarn
    C) Webpack
    D) pnpm
    Правильный ответ: C) Webpack

  6. Какой из следующих терминов описывает использование одного и того же кода в нескольких частях приложения?
    A) DRY (Don’t Repeat Yourself)
    B) KISS (Keep It Simple, Stupid)
    C) YAGNI (You Ain't Gonna Need It)
    D) SOLID
    Правильный ответ: A) DRY (Don’t Repeat Yourself)

  7. Какой из следующих методов позволяет выполнить SQL-запрос к базе данных в Node.js через библиотеку pg?
    A) client.connect()
    B) client.query()
    C) client.disconnect()
    D) client.execute()
    Правильный ответ: B) client.query()

  8. Какое событие генерируется при ошибке в потоках (Stream) Node.js?
    A) 'data'
    B) 'end'
    C) 'error'
    D) 'close'
    Правильный ответ: C) 'error'

  9. Какой из следующих паттернов проектирования часто используется в NestJS?
    A) MVC
    B) Observer
    C) Dependency Injection
    D) Singleton
    Правильный ответ: C) Dependency Injection

  10. Какой из следующих заголовков HTTP используется сервером для отправки cookie клиенту?
    A) Cookie
    B) Set-Cookie
    C) Authorization
    D) Content-Type
    Правильный ответ: B) Set-Cookie

  11. Какой из следующих подходов используется для ограничения количества запросов от одного клиента?
    A) JWT
    B) Rate limiting
    C) CORS
    D) Helmet
    Правильный ответ: B) Rate limiting

  12. Какой из следующих механизмов позволяет Node.js обрабатывать параллельные задачи без блокировок?
    A) Event Loop
    B) Garbage Collector
    C) Thread Pool
    D) V8 Engine
    Правильный ответ: A) Event Loop

  13. Какой из следующих фреймворков предоставляет готовую систему dependency injection и модульности?
    A) Express
    B) Fastify
    C) NestJS
    D) Koa
    Правильный ответ: C) NestJS

  14. Какой из следующих терминов описывает ситуацию, когда одно приложение использует слишком много ресурсов и мешает другим?
    A) Bottleneck
    B) Resource starvation
    C) Deadlock
    D) Race condition
    Правильный ответ: B) Resource starvation

  15. Какой из следующих методов позволяет запускать несколько экземпляров Node.js приложения на разных ядрах процессора?
    A) Cluster module
    B) Child process
    C) Worker threads
    D) Async/await
    Правильный ответ: A) Cluster module

  16. Какой из следующих инструментов используется для документирования REST API в Node.js?
    A) Swagger/OpenAPI
    B) ESLint
    C) Prettier
    D) Mocha
    Правильный ответ: A) Swagger/OpenAPI

  17. Какой из следующих терминов описывает архитектурный подход, при котором одна и та же бизнес-логика может быть использована в разных частях приложения?
    A) Reusability
    B) Abstraction
    C) Encapsulation
    D) Inheritance
    Правильный ответ: A) Reusability

  18. Какой из следующих механизмов обеспечивает безопасное хранение секретов (токенов, паролей) в Node.js приложении?
    A) .env файлы
    B) Environment variables
    C) Vault системы
    D) Все вышеперечисленное
    Правильный ответ: D) Все вышеперечисленное

  19. Какой из следующих терминов описывает ситуацию, когда запрос к одному сервису вызывает цепочку запросов к другим, и всё зависает при одном сбое?
    A) Cascading failure
    B) Throttling
    C) Load balancing
    D) Circuit breaker
    Правильный ответ: A) Cascading failure

  20. Какой из следующих протоколов поддерживает мультиплексирование запросов по одному соединению?
    A) HTTP/1.1
    B) HTTP/2
    C) FTP
    D) TCP
    Правильный ответ: B) HTTP/2

  21. Какой из следующих модулей в Node.js позволяет работать с URL и их составляющими?
    A) http
    B) url
    C) path
    D) querystring
    Правильный ответ: B) url

  22. Какой из следующих типов тестов проверяет поведение отдельной функции или модуля изолированно?
    A) Unit-тесты
    B) Интеграционные тесты
    C) End-to-end тесты
    D) Acceptance тесты
    Правильный ответ: A) Unit-тесты

  23. Какой из следующих инструментов используется для логирования в Node.js приложениях?
    A) Winston
    B) Morgan
    C) Bunyan
    D) Все вышеперечисленное
    Правильный ответ: D) Все вышеперечисленное

  24. Какой из следующих терминов описывает способность системы обрабатывать увеличивающуюся нагрузку за счёт добавления ресурсов?
    A) Availability
    B) Fault tolerance
    C) Scalability
    D) Maintainability
    Правильный ответ: C) Scalability

  25. Какой из следующих механизмов позволяет передавать данные между микросервисами в Node.js?
    A) REST API
    B) gRPC
    C) Message brokers
    D) Все вышеперечисленное
    Правильный ответ: D) Все вышеперечисленное

Экзаменационный билет №1

Теоретическая часть

  1. Опишите, как работает Event Loop в Node.js и какие фазы он включает.
  2. В чём разница между Readable, Writable, Duplex и Transform потоками?
 

Ответы на теоретическую часть:

  1. Event Loop — это механизм обработки асинхронных операций в Node.js. Он состоит из нескольких фаз: timers (выполняются setTimeout), pending callbacks (обработка некоторых callback-функций), idle/prepare (внутреннее использование), poll (ожидание событий ввода-вывода), check (выполняются setImmediate), close callbacks (закрытие соединений).
  2. Readable — для чтения данных, Writable — для записи, Duplex — одновременно читать и писать, Transform — Duplex, изменяющий данные при передаче.
 

Практическая часть

Напишите Express-роут, который принимает POST-запрос на /usersсохраняет объект пользователя в массив и возвращает статус 201 вместе с созданным объектом.

const express = require('express');
const app = express();
app.use(express.json());

let users = [];

app.post('/users', (req, res) => {
    const newUser = req.body;
    users.push(newUser);
    res.status(201).json(newUser);
});

 

Экзаменационный билет №2

Теоретическая часть

  1. Что такое JWT и как он используется в Node.js?
  2. Какие типы middleware вы знаете в Express и как они применяются?
 

Ответы на теоретическую часть:

  1. JWT (JSON Web Token) — это стандарт для безопасного обмена данными между клиентом и сервером. Используется для аутентификации и авторизации. Состоит из заголовка, payload и подписи. На стороне сервера генерируется токен, который клиент отправляет в дальнейших запросах.
  2. Application-level middleware применяется ко всем маршрутам через app.use()Router-level middleware (применяется к отдельным роутам), Error-handling middleware (обрабатывает ошибки), Built-in middleware например, express.json()Third-party middleware например, cors

Практическая часть

Создайте функцию на Node.js, которая читает файл data.txtи выводит количество строк в этом файле.

const fs = require('fs');

function countLinesInFile(filename) {
    try {
        const data = fs.readFileSync(filename, 'utf8');
        const lines = data.split('\n').length;
        console.log(`Количество строк: ${lines}`);
    } catch (err) {
        console.error('Ошибка чтения файла:', err.message);
    }
}

countLinesInFile('data.txt');

 

Экзаменационный билет №3

Теоретическая часть

  1. Что такое микросервисная архитектура и как она реализуется в Node.js?
  2. Какие основные отличия между CommonJS и ESM (ECMAScript Modules)?
 

Ответы на теоретическую часть:

  1. Микросервисная архитектура — это подход, при котором приложение состоит из множества независимых сервисов, каждый из которых решает свою задачу. Реализуется через отдельные Node.js-приложения, общающиеся друг с другом через REST, gRPC или сообщения (message brokers).
  2. CommonJS использует require() и module.exportsзагружает модули синхронно. ESM использует importexportподдерживает асинхронную загрузку, является стандартом ECMAScript.
 

Практическая часть

Напишите простой TCP-сервер на Node.js, который слушает порт 3000 и возвращает клиенту сообщение "Hello from server!" при подключении.

const net = require('net');

const server = net.createServer((socket) => {
    socket.write('Hello from server!\n');
    socket.end();
});

server.listen(3000, () => {
    console.log('TCP-сервер запущен на порту 3000');
});

 

Экзаменационный билет №4

Теоретическая часть

  1. Что такое Docker и зачем он используется в Node.js проектах?
  2. Как работают WebSockets в Node.js?
 

Ответы на теоретическую часть:

  1. Docker — это платформа для создания, запуска и управления контейнерами. В Node.js он применяется для изолированного запуска приложений, зависимостей, БД и CI/CD. Обеспечивает одинаковое поведение приложения в разных окружениях.
  2. WebSockets — это протокол двусторонней связи между клиентом и сервером. В Node.js реализуется через библиотеки ws или socket.ioСервер создаёт WebSocket-соединение и может отправлять/получать сообщения в реальном времени.
 

Практическая часть

Создайте Express-маршрут /products/:idкоторый возвращает JSON-объект товара по его ID из заранее определённого массива.

const express = require('express');
const app = express();

const products = [
    { id: 1, name: 'Laptop' },
    { id: 2, name: 'Phone' },
    { id: 3, name: 'Tablet' }
];

app.get('/products/:id', (req, res) => {
    const productId = parseInt(req.params.id);
    const product = products.find(p => p.id === productId);
    if (!product) return res.status(404).json({ error: 'Product not found' });
    res.json(product);
});

 

Экзаменационный билет №5

Теоретическая часть

  1. Что такое ORM и как её использовать в Node.js?
  2. Какие виды тестирования существуют в Node.js и как они реализуются?
 

Ответы на теоретическую часть:

  1. ORM (Object-Relational Mapping) — это инструмент, позволяющий взаимодействовать с базой данных через объекты, а не SQL-запросы. В Node.js популярны Sequelize, TypeORM, Mongoose. Они предоставляют методы CRUD, миграции и модели.
  2. Unit-тестирование (проверка отдельных модулей, Jest, Mocha), Интеграционное (проверка взаимодействия модулей/API), End-to-end (E2E, проверка работы всего приложения, Cypress, Playwright). Тесты могут включать mock-данные, spies, stubs.
 

Практическая часть

Напишите скрипт на Node.js, который делает GET-запрос к API https://api.example.com/data и выводит полученные данные в консоль.

const https = require('https');

https.get('https://api.example.com/data ', (res) => {
    let data = '';

    res.on('data', (chunk) => {
        data += chunk;
    });

    res.on('end', () => {
        console.log('Ответ от API:', JSON.parse(data));
    });

}).on('error', (err) => {
    console.error('Ошибка HTTP-запроса:', err.message);
});

 

 

 

Экзаменационный билет №6

Теоретическая часть

  1. Что такое Event Loop и как он связан с асинхронностью в Node.js?
  2. В чём разница между setTimeoutsetImmediate и process.nextTick()
 

Ответы на теоретическую часть:

  1. Event Loop — это механизм, позволяющий Node.js выполнять неблокирующие операции ввода-вывода, несмотря на однопоточность JavaScript. Он обрабатывает события по фазам: timers, pending callbacks, poll, check, close callbacks. Асинхронность достигается за счёт отложенного выполнения задач.
  2. setTimeout — выполняется после указанной задержки (в фазе timers). setImmediate — выполняется в фазе check. process.nextTick() — ставит задачу в очередь микрозадач и выполняется до следующей фазы event loop, даже если она уже начата.
 

Практическая часть

Напишите Express-роут /loginкоторый принимает POST-запрос с полями username и passwordпроверяет их на соответствие значениям 'admin' и '12345' соответственно и возвращает JSON { success: true }если совпадают, и статус 401 в противном случае.

const express = require('express');
const app = express();
app.use(express.json());

app.post('/login', (req, res) => {
    const { username, password } = req.body;

    if (username === 'admin' && password === '12345') {
        return res.json({ success: true });
    }

    res.status(401).json({ success: false, message: 'Invalid credentials' });
});

 

Экзаменационный билет №7

Теоретическая часть

  1. Охарактеризуйте REST API и его ключевые принципы.
  2. Какие типы потоков (Streams) вы знаете в Node.js и для чего они используются?
 

Ответы на теоретическую часть:

  1. REST (Representational State Transfer) — это стиль проектирования архитектуры для сетевых приложений. Основные принципы: клиент-серверная архитектура, отсутствие состояния (stateless), унифицированный интерфейс, кэшируемость, многоуровневая система.
  2. Readable — чтение данных, Writable — запись данных, Duplex — чтение и запись, Transform — преобразование данных при передаче.
 

Практическая часть

Создайте скрипт, который читает содержимое файла input.txt и записывает его в обратном порядке в файл output.txt

const fs = require('fs');

fs.readFile('input.txt', 'utf8', (err, data) => {
    if (err) {
        console.error('Ошибка чтения файла:', err.message);
        return;
    }

    const reversedData = data.split('').reverse().join('');
    fs.writeFile('output.txt', reversedData, (err) => {
        if (err) {
            console.error('Ошибка записи файла:', err.message);
            return;
        }
        console.log('Файл успешно записан');
    });
});

 

Экзаменационный билет №8

Теоретическая часть

  1. Что такое middleware в Express и какие виды middleware вы знаете?
  2. Как работают HTTP-статус коды? Приведите примеры.

Ответы на теоретическую часть:

  1. Middleware — это функция, которая имеет доступ к объектам reqres и следующей middleware nextВиды: Application-level, Router-level, Error-handling, Built-in, Third-party.
  2. HTTP-статус коды информируют о результате HTTP-запроса. Примеры: 200 OK, 201 Created, 400 Bad Request, 401 Unauthorized, 404 Not Found, 500 Internal Server Error.
 

Практическая часть

Реализуйте Express-роут /sumкоторый принимает GET-запрос с двумя query-параметрами a и bвозвращает JSON-ответ { result: a + b }Обработайте случай, когда параметры не являются числами.

const express = require('express');
const app = express();

app.get('/sum', (req, res) => {
    const { a, b } = req.query;
    const numA = parseFloat(a);
    const numB = parseFloat(b);

    if (isNaN(numA) || isNaN(numB)) {
        return res.status(400).json({ error: 'Оба параметра должны быть числами' });
    }

    res.json({ result: numA + numB });
});

 

Экзаменационный билет №9

Теоретическая часть

  1. Что такое Dockerfile и для чего он используется?
  2. Что такое JWT и из каких частей он состоит?
 

Ответы на теоретическую часть:

  1. Dockerfile — это текстовый файл с инструкциями, по которым создаётся образ Docker-контейнера. Он определяет базовый образ, зависимости, команды запуска и т. д.
  2. JWT (JSON Web Token) — формат безопасного обмена данными. Состоит из трёх частей: Header (тип токена и алгоритм шифрования), Payload (полезная нагрузка), Signature (подпись).
 

Практическая часть

Создайте TCP-клиент на Node.js, который подключается к серверу на порту 3000 и получает сообщение "Hello from server!".

const net = require('net');

const client = new net.Socket();

client.connect(3000, '127.0.0.1', () => {
    console.log('Подключено к серверу');
});

client.on('data', (data) => {
    console.log('Получено:', data.toString());
    client.destroy(); // Закрываем соединение
});

client.on('close', () => {
    console.log('Соединение закрыто');
});

 

Экзаменационный билет №10

Теоретическая часть

  1. Что такое CI/CD и как его можно реализовать в Node.js проектах?
  2. В чём разница между module.exports и export default в Node.js?
 

Ответы на теоретическую часть:

  1. CI/CD — это практика автоматизации сборки, тестирования и деплоя приложений. Реализуется через GitHub Actions, GitLab CI, Jenkins. В Node.js включает установку зависимостей, запуск тестов, линтинга, деплой.
  2. module.exports — CommonJS, используется по умолчанию в Node.js. export default — часть стандарта ESM (ECMAScript Modules), более современный способ экспорта.
 

Практическая часть

Напишите функцию filterEvenNumbers(arr)которая принимает массив чисел и возвращает новый массив только с нечётными числами. Используйте Array.filter

function filterEvenNumbers(arr) {
    return arr.filter(num => num % 2 !== 0);
}

console.log(filterEvenNumbers([1, 2, 3, 4, 5])); // [1, 3, 5]

 

Экзаменационный билет №11

Теоретическая часть

  1. Охарактеризуйте архитектуру микросервисов и её преимущества в Node.js приложениях.
  2. Что такое пул соединений (connection pool) и зачем он нужен при работе с базами данных?
 

Ответы на теоретическую часть:

  1. Микросервисная архитектура — это подход, при котором приложение состоит из множества независимых сервисов, каждый из которых решает свою задачу. Преимущества: гибкость, масштабируемость, возможность обновлять отдельные части приложения без остановки всей системы. В Node.js реализуется через Express/NestJS + контейнеры/оркестраторы.
  2. Connection pool — это набор предварительно установленных соединений с БД, которые можно повторно использовать. Уменьшает нагрузку на сервер, ускоряет выполнение запросов и предотвращает переполнение подключений.
 

Практическая часть

Создайте Express-роут /multiplyкоторый принимает GET-запрос с параметром num и возвращает JSON { result: num * 5 }Если numне число, верните статус 400 и сообщение об ошибке.

const express = require('express');
const app = express();

app.get('/multiply', (req, res) => {
    const { num } = req.query;
    const value = parseFloat(num);

    if (isNaN(value)) {
        return res.status(400).json({ error: 'num должен быть числом' });
    }

    res.json({ result: value * 5 });
});

 

Экзаменационный билет №12

Теоретическая часть

  1. Какие типы тестирования вы знаете? Приведите примеры использования в Node.js.
  2. Что такое graceful shutdown и как его реализовать в Node.js?
 

Ответы на теоретическую часть:

  1. Unit-тестирование — проверка отдельных функций (Jest, Mocha), Интеграционное — проверка взаимодействия модулей/API, E2E — полный цикл работы приложения (Cypress, Playwright).
  2. Graceful shutdown — корректное завершение работы приложения с завершением текущих операций. Реализуется через обработчики SIGTERMSIGINTзакрытие соединений с БД и сервера.
 

Практическая часть

Напишите скрипт, который создаёт файл log.txt и записывает в него текущую дату и время каждые 5 секунд. После трёх записей процесс должен завершиться.

const fs = require('fs');
const interval = setInterval(() => {
    const now = new Date().toISOString();
    fs.appendFile('log.txt', `${now}\n`, (err) => {
        if (err) console.error(err);
    });

    count++;
    if (count >= 3) {
        clearInterval(interval);
        console.log('Логи записаны');
    }
}, 5000);

let count = 0;

 

Экзаменационный билет №13

Теоретическая часть

  1. В чём разница между process.exit() и server.close() в Node.js?
  2. Что такое observability и какие инструменты используются для этого в Node.js?
 

Ответы на теоретическую часть:

  1. В чём разница между process.exit() и server.close() в Node.js?
  2. Что такое observability и какие инструменты используются для этого в Node.js?
 

Практическая часть

Реализуйте Express-роут /users/:idкоторый возвращает пользователя по ID. Если пользователь не найден, возвращайте статус 404 и сообщение { error: "User not found" }

const express = require('express');
const app = express();

const users = [
    { id: 1, name: 'Alice' },
    { id: 2, name: 'Bob' },
];

app.get('/users/:id', (req, res) => {
    const userId = parseInt(req.params.id);
    const user = users.find(u => u.id === userId);

    if (!user) {
        return res.status(404).json({ error: 'User not found' });
    }

    res.json(user);
});

 

Экзаменационный билет №14

Теоретическая часть

  1. Что такое dependency injection и как он реализуется в NestJS?
  2. Как работают HTTP-заголовки? Приведите примеры их использования в Node.js.
 

Ответы на теоретическую часть:

  1. Dependency Injection (DI) — это паттерн, позволяющий внедрять зависимости в классы или функции. В NestJS DI реализован через декораторы@Injectable()и контейнер зависимостей.
  2. HTTP-заголовки содержат метаданные запроса/ответа. Примеры: Content-TypeAuthorizationSet-CookieИспользуются в Express через req.headersres.setHeader()

Практическая часть

Создайте TCP-сервер, который при получении сообщения от клиента выводит его в консоль и отправляет клиенту ответ "Message received".

const net = require('net');

const server = net.createServer((socket) => {
    socket.on('data', (data) => {
        console.log('Получено:', data.toString());
        socket.write('Message received\n');
    });
});

server.listen(3000, () => {
    console.log('TCP-сервер запущен на порту 3000');
});

 

Экзаменационный билет №15

Теоретическая часть

  1. Что такое миграции баз данных и как они реализуются в Node.js?
  2. В чём разница между async/await и .then() в Node.js?
 

Ответы на теоретическую часть:

  1. Миграции — это история изменений схемы БД. Реализуются через knexsequelize-clitypeormКаждая миграция содержит методы up (применить изменения) и down (откатить).
  2. async/await — синтаксический сахар над Promise, упрощает написание асинхронного кода. .then() — более старый способ обработки Promise через цепочку вызовов.

Практическая часть

Напишите функцию sumFromFile(filename)которая читает числовой массив из файла, суммирует значения и возвращает результат. Обработайте возможные ошибки чтения файла.

const fs = require('fs');

function sumFromFile(filename) {
    try {
        const data = fs.readFileSync(filename, 'utf8');
        const numbers = JSON.parse(data);
        const sum = numbers.reduce((acc, num) => acc + num, 0);
        return sum;
    } catch (err) {
        throw new Error(`Ошибка чтения файла: ${err.message}`);
    }
}

console.log(sumFromFile('numbers.json'));

(1) Кейс: "Неожиданное падение производительности API после обновления"


Описание кейса

Вы работаете над backend-сервисом на Node.js, который предоставляет REST API для системы бронирования отелей. После увеличения нагрузки (в связи с ростом пользователей) вы решили улучшить отказоустойчивость и производительность, развернув несколько инстансов сервиса за Nginx в Docker-контейнерах.

Однако вскоре начались проблемы:

  • Значительное количество запросов к эндпоинту /bookings завершается ошибкой 502 Bad Gateway
  • Сервис начинает нестабильно работать в часы пиковой нагрузки.
  • Логи показывают частые timeout'ы при работе с PostgreSQL.
  • Иногда клиент получает ответы от разных инстансов с противоречивыми данными.

Технологии:

  • Node.js 18
  • Express
  • PostgreSQL
  • Docker
  • Nginx как reverse proxy и load balancer

Анализ ситуации и выявление проблем


Проблема №1: Ось "Неправильная настройка пула соединений с БД"

Причина:
Каждый из запущенных инстансов Node.js создавал свой собственный пул подключений к БД. При множестве контейнеров это привело к исчерпанию лимита подключений к PostgreSQL.

Решение:
Настроили оптимальный размер пула в Sequelize или pgчтобы избежать перегрузки БД:

const sequelize = new Sequelize('database', 'user', 'password', {
  host: 'db',
  dialect: 'postgres',
  pool: {
    max: 10,     // Максимум 10 подключений на инстанс
    min: 2,
    acquire: 30000,
    idle: 10000
  }
});

 

Проблема №2: Ось "Отсутствие sticky sessions при использовании JWT"

Причина:
Сервис использует сессионное хранение данных аутентификацииexpress-sessionи хранил данные в памяти. Поскольку Nginx балансировал нагрузку без учета сессий, запросы одного пользователя могли попадать на разные инстансы.

Решение:
Перевели сессии в централизованное хранилище connect-redisи настроили Nginx на использование ip_hashдля распределения трафика:

upstream node_backend {
    ip_hash;
    server node_app_1;
    server node_app_2;
}

 

Проблема №3: Ось "Высокая нагрузка на базу данных"

Причина:
Эндпоинт /bookings делал сложные SQL-запросы без кэширования, что вызывало высокую нагрузку на БД.

Решение:
Ввели кэширование результатов с помощью Redis:

const cached = await redis.get(`bookings:${userId}`);
if (cached) return res.json(JSON.parse(cached));

// Если в кэше нет — делаем запрос к БД
const bookings = await Booking.findAll({ where: { userId } });
await redis.setex(`bookings:${userId}`, 60, JSON.stringify(bookings));
res.json(bookings);

 

Проблема №4: Ось "Неправильная настройка health-check'а в контейнерах"

Причина:
Некоторые контейнеры продолжали принимать трафик даже в состоянии перегрузки или недоступности БД.

Решение:
Добавили корректный health-check в Dockerfile:

HEALTHCHECK CMD curl -f http://localhost:3000/health || exit 1

И реализовали простой эндпоинт /health

app.get('/health', async (req, res) => {
    try {
        await sequelize.authenticate();
        res.status(200).send('OK');
    } catch (err) {
        res.status(503).send('Service unavailable');
    }
});

 

Проблема №5: Ось "Недостаточная горизонтальная масштабируемость"

Причина:
Некоторые фоновые задачи (например, отправка email) выполнялись внутри основного процесса, блокируя обработку других запросов.

Решение:
Вынесли такие задачи в очередь сообщений bullRabbitMQKafkaЭто позволило освободить основной поток и равномерно распределить нагрузку.

 

Обучающие моменты

 

  1. Масштабируемость требует централизованного управления состоянием:
    При использовании нескольких инстансов нельзя полагаться на локальное хранение данных (например, в памяти). Нужно использовать Redis или другие внешние хранилища.

  2. Пул соединений к БД — это критично:
    Каждый инстанс должен учитывать ограничения БД. Используйте пулы и не забывайте про баланс между числом подключений и производительностью.

  3. Кэширование — ключ к высокой доступности:
    Часто используемые данные лучше всего кэшировать, чтобы снизить нагрузку на БД и ускорить ответ.

  4. Фоновые задачи должны выполняться асинхронно:
    Все тяжёлые операции (обработка файлов, отправка email, генерация отчётов) должны быть вынесены в очереди задач.

  5. Health-check и мониторинг — обязательны:
    Без них вы можете не заметить, что часть сервиса уже недоступна, но продолжает получать запросы.

 

Дополнительные задания для самостоятельной работы

  1. Добавьте rate limiting на эндпоинт /bookingsИспользуйте express-rate-limitчтобы ограничить количество запросов на пользователя.

  2. Реализуйте fallback-ответ при недоступности БД.
    Если БД не отвечает, возвращайте закэшированные данные или сообщение о временной недоступности.

  3. Вынесите обработку изображений в отдельный микросервис.
    Создайте новый Node.js сервис, который будет заниматься только ресайзом и хранением изображений.

  4. Настройте автоматический рестарт контейнеров при падении.
    Добавьте restart: always в docker-compose.yml

  5. Добавьте логирование в ELK-стек (Elasticsearch, Logstash, Kibana).
    Настройте сбор логов всех сервисов и построение графиков нагрузки и ошибок.

  6. Интегрируйте Prometheus + Grafana для метрик.
    Отслеживайте время выполнения запросов, использование CPU, количество активных подключений.

 

(2) Кейс: "Неожидаемое поведение API при параллельных запросах"


Описание кейса

Вы работаете над backend-сервисом на Node.js, который предоставляет API для системы управления задачами (task tracker). Один из ключевых эндпоинтов — /tasks/:id/complete — помечает задачу как выполненную.

После запуска сервиса пользователи начали жаловаться на странное поведение:

  • Иногда задача не отмечается как выполненная, хотя клиент получает ответ 200 OK
  • В некоторых случаях две параллельные команды от разных пользователей завершают одну и ту же задачу дважды.
  • Логи показывают ошибки вида Deadlock found when trying to get lock

Технологии:

  • Node.js 18
  • Express
  • PostgreSQL + Sequelize ORM
  • REST API
 

Анализ ситуации и выявление проблем


Проблема №1: "Некорректная обработка конкурентных запросов к БД"

Причина:
Метод Task.update() в Sequelize использует операцию UPDATEкоторая может привести к гонке данных при одновременных запросах. Если два пользователя пытаются обновить одну запись, они могут перезаписать друг друга или вызвать deadlock в БД.

Решение:
Использование оптимистической блокировки (optimistic concurrency control) с версионированием данных.

Включите поддержку версий в модель:

const Task = sequelize.define('Task', {
    title: DataTypes.STRING,
    completed: DataTypes.BOOLEAN,
}, {
    version: true // Добавляет поле version
});

 

Теперь при обновлении будет проверяться версия:

try {
    const task = await Task.findByPk(req.params.id);
    task.completed = true;
    await task.save(); // выбросит ошибку, если версия не совпадает
} catch (err) {
    res.status(409).json({ error: 'Конфликт изменений. Попробуйте снова.' });
}

 

Проблема №2: Ось "Отсутствие транзакций при сложных операциях"

Причина:
Если логика завершения задачи включает обновление нескольких таблиц (например, историю действий), но эти изменения не оборачиваются в транзакцию, возможны частичные изменения состояния.

Решение:
Оборачивайте такие операции в транзакции:

const transaction = await sequelize.transaction();
try {
    const task = await Task.findByPk(req.params.id, { transaction });
    task.completed = true;
    await task.save({ transaction });

    await Activity.create({
        userId: req.user.id,
        action: 'task_completed',
        taskId: task.id
    }, { transaction });

    await transaction.commit();
} catch (err) {
    await transaction.rollback();
    res.status(500).json({ error: 'Ошибка выполнения операции' });
}

 

Проблема №3: "Неверно реализованная бизнес-логика"

Причина:
Завершение задачи не проверяет её текущее состояние. Пользователь может «завершить» уже завершённую задачу.

Решение:
Добавьте проверку перед обновлением:

const task = await Task.findByPk(req.params.id);
if (!task || task.completed) {
    return res.status(400).json({ error: 'Задача уже завершена или не существует' });
}

task.completed = true;
await task.save();

 

Проблема №4: "Нет ограничений на повторяющиеся действия"

Причина:
Одна и та же команда может быть отправлена несколько раз (например, пользователь кликнул дважды), что приводит к дублированию действий.

Решение:
Добавьте идемпотентность через идентификатор запроса:

app.post('/tasks/:id/complete', async (req, res) => {
    const requestId = req.headers['x-request-id'];
    if (!requestId) {
        return res.status(400).json({ error: 'Отсутствует x-request-id' });
    }

    const existing = await RequestLog.findOne({ where: { requestId } });
    if (existing) {
        return res.status(200).json({ message: 'Запрос уже обработан' });
    }

    // Выполняем операцию
    const task = await Task.findByPk(req.params.id);
    task.completed = true;
    await task.save();

    // Записываем ID запроса
    await RequestLog.create({ requestId });

    res.json({ success: true });
});

 

Проблема №5: "Проблема: Нет механизма retry logic при ошибках БД"

Причина:
Некоторые ошибки базы данных (например, временные сбои соединения) приводят к падению всего запроса.

Решение:
Используйте библиотеки вроде async-retryили встроенный механизм повторов в Sequelize:

const retry = require('async-retry');

await retry(async () => {
    const task = await Task.findByPk(req.params.id);
    task.completed = true;
    await task.save();
}, {
    retries: 3,
    onRetry: (err) => console.log('Повтор запроса:', err.message)
});

 

Обучающие моменты

  • Конкурентный доступ к данным требует контроля. Используйте optimistic/pessimistic locking.
  • Транзакции помогают сохранить согласованность. Все или ничего.
  • Идемпотентность важна. Это особенно актуально для POST/PUT/PATCH.
  • Повторные попытки (retry logic) необходимы. Особенно при работе с внешними системами.
  • Логирование и мониторинг помогут выявлять проблемные места.
 

Дополнительные задания для самостоятельной работы

  1. Реализуйте pessimistic locking с помощью sequelizeModel.findOne({ lock: true })и протестируйте его работу.
  2. Настройте deadlock retry handler , чтобы автоматически перезапускать транзакции при конфликтах.
  3. Добавьте ETag / If-Match заголовки для предотвращения обновления устаревших данных.
  4. Реализуйте версию задачи в URL/tasks/123?version=4для явного контроля за обновлениями.
  5. Добавьте OpenAPI документацию , где будут указаны коды ошибок и примеры использования заголовков.

Ролевая игра №1: «Спасите сервис!» (Save the Service!)


Цель игры:

Научить студентов распознавать и решать типичные проблемы, возникающие в production-среде при разработке backend-сервисов на Node.js. Развить навыки анализа логов, диагностики производительности, принятия архитектурных решений и командной работы.

 

Формат игры:

  • Тип: Симуляция реальной ситуации
  • Длительность: 90–120 минут
  • Форма: Командная ролевая игра с элементами квеста и мозгового штурма
  • Участники: 3–5 человек в команде, 2+ команды
 

Сеттинг:

Вы — инженеры в стартапе TravelMateкоторый предоставляет API для поиска и бронирования путешествий. Сервис работает на Node.js + Express , использует PostgreSQL и Redis , развернут через Docker .

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

Вам предстоит в роли DevOps-инженера, backend-разработчика, QA и техлида совместно выяснить, что пошло не так, и спасти проект.

 

Роли в команде:

 
Роль
Основные задачи
Ключевые навыки и ответственность
Backend-разработчик
Анализ кодовой базы, поиск утечек памяти, блокирующих операций, логических ошибок
Умение читать Node.js-код, понимать асинхронность, работать с Express, Sequelize, Redis, потоками. Диагностировать проблемы в бизнес-логике
DevOps-инженер
Проверка Docker-конфигураций, Nginx, health-checkов, анализ метрик загрузки системы
Навыки работы с контейнерами, настройка ресурсных лимитов, понимание reverse proxy, мониторинг производительности, работа с логами
QA / Тестировщик
Поиск багов, проверка гипотез, тестирование решений, воспроизведение проблем
Знание основ тестирования (unit, интеграционное), опыт воспроизведения race condition, deadlock, некорректной обработки входных данных
Технический лидер / Архитектор (опционально)
Координация команды, принятие финального решения, составление плана действий
Управленческие навыки, понимание архитектурных решений, способность выбирать между разными подходами, руководить дискуссией, принимать технические решения
 

Этапы игры:

Этап 1: Получение задания 

Команда получает описание проблемы:

"После запуска новой версии сервиса /search стал работать медленно. Иногда возвращает ошибку 502, CPU usage доходит до 100%, падают некоторые инстансы."

Игроки получают:

  • Описание технологического стека
  • Логи (поддельные, но реалистичные)
  • Примеры запросов/ответов
  • Метрики системы (графики времени отклика, загрузки CPU)
 

Этап 2: Диагностика 

Команда анализирует:

  • Логи (таймауты, deadlock, event loop delay)
  • Данные мониторинга (CPU, memory, DB load)
  • Конфигурацию сервиса (Dockerfile, Nginx, Sequelize pool)
  • Фрагменты кода (например, неправильное использование async/awaitблокировка event loop)
 

Этап 3: Гипотезы и решение 

Команда формулирует гипотезы о причинах:

  • Неправильный размер пула БД?
  • Отсутствие кэширования?
  • Блокирующая операция?
  • Неверная конфигурация контейнера?
 

Предлагают решения:

  • Настройка пула соединений
  • Кэширование результатов
  • Перенос задач в очередь
  • Оптимизация event loop
  • Введение rate limiting
 

Этап 4: Защита решения 

Команда представляет своё решение перед преподавателем или другой командой:

  • Что вы нашли
  • Как это влияло на систему
  • Какое решение вы предлагаете
  • Какие обучающие моменты вы вынесли
 

Преподаватель может задавать вопросы, имитировать сложности внедрения, просить обосновать выбор решения.

 

Обучающие эффекты:

  • Понимание принципов асинхронности и работы event loop
  • Навык анализа логов и метрик
  • Знание, как настраивать пулы подключений к БД
  • Практика использования очередей задач (bull, RabbitMQ и т.п.)
  • Навыки работы с Docker, Nginx, Redis
  • Понимание важности health check'ов и graceful shutdown
  • Опыт диагностики и устранения deadlock’ов и race condition'ов
 

Примеры скрытых проблем (карточки):

Категория
Проблема
Возможное решение
Производительность
Блокирующая обработка изображений в основном потоке
Вынос в worker thread или очередь
База данных
Частые full table scan из-за отсутствия индексов
Добавление индексов
Архитектура
Отсутствие кэширования популярных запросов
Введение Redis
Деплой
Нет ограничений на ресурсы в Docker
Добавление limits
Безопасность
Неограниченное количество запросов от одного пользователя
Rate limiting
Состояние
Параллельные изменения одной записи
Версионирование или транзакции

Материалы для игры:

  • Примеры логов (в текстовых файлах)
  • Фрагменты кода с ошибками
  • Docker-compose.yml с проблемной конфигурацией
  • Примеры метрик (можно использовать графики в PDF)
  • Шаблон ответа (форма: проблема → диагноз → решение)
 

Возможные проблемы во время игры:

  • Игроки не понимают, где искать проблему
  • Некоторые участники доминируют, другие остаются без дела
  • Команда выбирает неэффективное решение (например, масштабирование вместо оптимизации)

Как решить:

  • Предоставьте подсказки («Посмотрите логи», «Проверьте пул БД»)
  • Назначьте четкие роли и обязанности
  • Поощряйте обсуждение разных вариантов

 

Ролевая игра №2: «Атака хакеров!» (Hack Attack!)


Цель игры:

Научить студентов распознавать и предотвращать распространённые уязвимости в backend-приложениях на Node.js. Развить навыки безопасной разработки, анализа логов атак, принятия решений под давлением и командной работы.

 

Формат игры:

  • Тип: Симуляция реальной кибератаки
  • Длительность: 90–120 минут
  • Форма: Командная ролевая игра с элементами CTF (Capture The Flag) и дебага
  • Участники: 3–5 человек в команде, 2+ команды
 

Сеттинг:

Вы — команда разработчиков сервиса SecureNotesкоторый позволяет пользователям сохранять зашифрованные заметки в облаке. Сервис написан на Node.js + Express , использует JWT для авторизации , взаимодействует с PostgreSQL и развернут через Docker .

Внезапно система начинает вести себя странно:

  • Пользователи получают ошибки доступа.
  • В логах появляются странные запросы.
  • Некоторые аккаунты были взломаны.

Вы получаете сигнал от службы безопасности: на ваш сервис идёт активная атака .

Вам нужно выяснить, как именно вас атакуют, найти уязвимости и закрыть их до того, как будет поздно .

 

Роли в команде :

Роль
Основные задачи
Ключевые навыки и ответственность
Backend-разработчик
Анализ кода, поиск уязвимостей в бизнес-логике, проверка входных данных
Умение читать Node.js-код, понимание REST API, работа с Express, проверка безопасности обработки данных, понимание OWASP Top 10
DevSecOps / Инженер безопасности
Анализ логов, проверка конфигураций, мониторинг трафика, настройка защиты
Знание принципов безопасного деплоя, работа с заголовками, ограничениями, firewall, логированием, понимание типов атак (SQLi, XSS, IDOR, CSRF)
QA / Тестировщик безопасности
Поиск багов, воспроизведение атак, тестирование гипотез
Умение писать минимальные PoC (Proof of Concept), тестировать приложение на уязвимости, использовать Postman/curl для проверок
Технический лидер / Архитектор (опционально)
Координация команды, принятие финальных решений, составление плана действий
Умение выбирать между trade-off'ами безопасности и удобства, принимать решения под давлением, руководить командой

Этапы игры:

Этап 1: Получение сигнала тревоги 

Команда получает уведомление о подозрительной активности:

"Обнаружены необычные GET-запросы к /notes/:idПодозрение на IDOR. Также есть массовые POST-запросы к /login с подбором паролей."

Игроки получают:

  • Логи (поддельные, но реалистичные)
  • Фрагменты кода с потенциальными уязвимостями
  • Данные мониторинга (кол-во запросов, IP, user-agent)
  • Примеры атакующих запросов
 

Этап 2: Анализ инцидента 

Команда изучает:

  • Логи (SQL injection, подбор паролей, подмена id)
  • Конфигурации (например, слабый JWT secret или отсутствие rate limiting)
  • Бизнес-логику (например, отсутствие проверки владельца заметки)
  • Используемые технологии express-session

Этап 3: Выявление уязвимостей 

Команда формулирует гипотезы:

  • SQL Injection через /search
  • IDOR в /notes/:id
  • Brute-force атака на /login
  • XSS в полях заметок
  • CSRF в формах
 

Предлагают решения:

  • Санитизация ввода
  • Rate limiting
  • Проверка прав доступа
  • Обновление зависимостей
  • Использование helmet, CSP, SameSite cookies
 

Этап 4: Защита системы 

Команда представляет своё решение перед преподавателем:

  • Какие уязвимости нашли
  • Как они могли быть использованы злоумышленниками
  • Какие действия необходимо выполнить
  • Какие лучшие практики безопасности нарушили ранее
 

Преподаватель может имитировать "вторую волну атак" и проверить, закрыты ли уязвимости.

 

Обучающие эффекты:

  • Понимание основных типов атак (SQLi, XSS, CSRF, IDOR, Brute-force)
  • Навык использования механизмов безопасности в Node.js (helmet, cookie-parser, rate-limiting)
  • Опыт диагностики и исправления уязвимостей
  • Знание принципов работы JWT и сессий
  • Понимание важности валидации и санитизации ввода
  • Навык чтения логов и выявления подозрительных активностей
 

Примеры скрытых уязвимостей :

Категория
Уязвимость
Возможное решение
Безопасность API
SQL injection через параметр?query=
Использование ORM или параметризованных запросов
Авторизация
Отсутствие проверки владельца заметки в/notes/:id
Добавление проверкиreq.user.id === note.userId
Аутентификация
Слабое ограничение на попытки входа
Внедрениеrate-limiter-flexible
Сессии
ОтсутствиеSameSiteиHttpOnlyв куках
Настройка опцийres.cookie()
Заголовки
Отсутствие заголовков безопасности
Внедрениеhelmet
JWT
Слабый секрет и долгий срок жизни токена
Генерация стойкого ключа, короткий TTL, refresh token flow

Материалы для игры:

  • Примеры логов с подозрительной активностью
  • Фрагменты кода с уязвимостями (например, роут /login без rate limiting)
  • Docker-compose.yml с текущими настройками
  • Примеры атакующих запросов (curl, Postman-примеры)
  • Шаблон отчета: проблема → атака → исправление
 

Возможные проблемы во время игры:

  • Игроки не понимают, как работает атака
  • Не могут связать логи с конкретной уязвимостью
  • Предлагают избыточные или неверные решения
 

Как решить:

  • Давайте подсказки id
  • Показывайте примеры атак
  • Задавайте вопросы типа: «Что произойдёт, если отправить такой запрос?»
 

Ролевая игра №3: «Падает микросервис!» (The Fall of a Microservice!)


Цель игры:

Научить студентов диагностировать и решать типичные проблемы в распределённой архитектуре, связанные с работой микросервисов. Развить навыки работы с контейнерами, service discovery, логированием, мониторингом, обработкой ошибок и командного взаимодействия.

 

Формат игры:

  • Тип: Симуляция отказа в микросервисной системе
  • Длительность: 90–120 минут
  • Форма: Командная ролевая игра с элементами квеста и дебага
  • Участники: 4–6 человек в команде, 1–2 команды
 

Сеттинг:

Вы — часть команды, поддерживающей платформу ShopMate — интернет-магазин с распределённой архитектурой на базе Node.js , где каждый компонент — отдельный микросервис:

  • Auth Service (JWT)
  • Catalog Service (PostgreSQL)
  • Order Service (MongoDB)
  • Payment Service (Redis)
  • API Gateway / BFF
  • Service Discovery (Consul)
 

Внезапно пользователи начали жаловаться:

"Не могу оформить заказ", "Ошибка оплаты", "Заказ не отображается"

Логи показывают, что некоторые сервисы недоступны или возвращают ошибки. Мониторинг сообщает о таймаутах между сервисами.

Вам нужно выяснить, что пошло не так , восстановить работу системы и предотвратить подобное в будущем.

 

Роли в команде :

Роль
Основные задачи
Ключевые навыки и ответственность
Backend-разработчик сервиса
Анализ кода своего сервиса, поиск багов, проверка API
Умение читать Node.js-код, понимать REST/gRPC, работать с Express/NestJS, находить утечки памяти, блокировки, ошибки бизнес-логики
DevOps-инженер
Проверка состояния контейнеров, сетевых настроек, health-check'ов, мониторинга
Знание Docker, Kubernetes, Nginx, Prometheus, Grafana, работа с логами, диагностика проблем сети и доступности сервисов
SRE / Инженер надёжности
Поиск причин падения сервисов, цепочки отказов, анализ логов сервисов
Навыки анализа событий, понимание retries, timeouts, circuit breaker, retry logic, graceful shutdown, observability
QA / Тестировщик интеграции
Воспроизведение запросов между сервисами, проверка корректности вызовов
Умение использовать Postman, curl, тестировать межсервисное взаимодействие, находить ошибки в API, timeout'ы, неверные URL
Service Mesh / Архитектор (опционально)
Координация взаимодействия сервисов, выбор стратегии восстановления, рекомендации по архитектуре
Понимание service discovery, sidecar proxy, load balancing, шифрования между сервисами, управление версиями (canary release), знание Istio/Linkerd

Этапы игры:

Этап 1: Получение сигнала тревоги 

Команда получает информацию:

"Сервис order-service не может получить данные из catalog-serviceТакже payment-service не отвечает на запросы. Возможно, произошёл cascade failure."

Игроки получают:

  • Логи сервисовordercatalogpayment
  • Графики метрик (latency, error rate, CPU, memory)
  • Фрагменты конфигураций (Docker, Kubernetes, service mesh)
  • Примеры запросов между сервисами
 

Этап 2: Диагностика 

Команда исследует:

  • Логи сервисов (таймауты, ошибки соединения, падения)
  • Конфигурации (DNS, network policies, endpoints)
  • Мониторинг (load, latency, error rate)
  • Исходный код (например, отсутствие retry logic, некорректный вызов gRPC)
 

Этап 3: Выявление проблем 

Команда формулирует гипотезы:

  • Сервис catalog перегружен → вызывает таймауты в order
  • Отсутствие circuit breaker → cascade failure
  • Redis в payment-service переполнен → ошибки оплаты
  • Обрыв связи между сервисами → network policy
 

Предлагают решения:

  • Ввести circuit breakeropossumresilient
  • Настроить retry + timeout для вызовов
  • Добавить балансировку нагрузки через service mesh
  • Поднять количество реплик сервиса
  • Проверить health check и readinessProbe
 

Этап 4: Защита решения 

Команда представляет:

  • Что они нашли (проблемы в архитектуре, настройках, коде)
  • Как это влияло на систему
  • Какие действия необходимо выполнить
  • Какие практики будут внедрены в будущем
 

Преподаватель может задавать вопросы, имитировать сложности, просить обосновать выбор решения.

 

Обучающие эффекты:

  • Понимание особенностей микросервисной архитектуры
  • Навык диагностики межсервисных коммуникаций
  • Опыт работы с service discovery (Consul, etcd, Eureka)
  • Понимание принципов resilience: retries, timeouts, circuit breaker
  • Навык использования service mesh (Istio, Linkerd) или собственных решений
  • Знание best practices по observability: логирование, tracing, метрики
  • Опыт масштабирования и управления состоянием в распределённой системе
 

Примеры скрытых проблем :

Категория
Проблема
Возможное решение
Микросервисы
order-serviceне имеет retry-логики при ошибкеcatalog-service
Добавить retry с экспоненциальным backoff
Сеть
Нарушена network policy междуpaymentиorder
Проверить и исправить Kubernetes NetworkPolicy
Производительность
catalog-serviceперегружен, нет пула подключений
Настроить пул соединений, увеличить число реплик
Отказоустойчивость
Отсутствие circuit breaker привело к cascade failure
Внедритьopossumили использовать service mesh
Логирование
Нет уникального trace ID → сложно отследить запрос
Использовать OpenTelemetry, добавить correlation ID
Состояние
payment-serviceиспользует Redis как очередь без TTL → очередь заблокирована
Перейти на message broker (Kafka, RabbitMQ) или настроить TTL
CI/CD
Последнее обновлениеcatalog-serviceсодержало regress
Откат до предыдущей версии или hotfix

Материалы для игры:

  • Примеры логов сервисов
  • Фрагменты кода с проблемными вызовами
  • Docker-compose.yml / Kubernetes manifests
  • Примеры ошибок в мониторинге (Grafana/Prometheus)
  • Шаблон отчёта: проблема → диагноз → решение
 

Возможные проблемы во время игры:

  • Игроки не понимают, как работают микросервисы между собой
  • Команда не видит связи между проблемами разных сервисов
  • Не могут выбрать между scale и fix
 

Как решить:

  • Предоставьте подсказки («Проверьте логи payment», «Посмотрите, как работает вызов catalog»)
  • Объясните, что такое cascading failure и как его избежать
  • Помогайте структурировать мысли через вопросы: «Что вызывает этот сервис?», «Как он реагирует на ошибку?»
 

Ролевая игра №4: «Ошибка в продакшене!» (Production Panic!)


Цель игры:

Научить студентов быстро реагировать на критические ошибки в боевой среде, диагностировать проблемы по логам и метрикам, принимать решения под давлением времени и в условиях нехватки информации. Развить навыки командной работы, дебага, понимания CI/CD и взаимодействия с мониторингом.

 

Формат игры:

  • Тип: Симуляция реального инцидента в production
  • Длительность: 90–120 минут
  • Форма: Командная ролевая игра с элементами incident response и технического расследования
  • Участники: 3–5 человек в команде, 1–2 команды
 

Сеттинг:

Вы — часть команды backend-разработчиков сервиса TaskFlow — это приложение для управления задачами, используемое тысячами пользователей ежедневно. Сервис работает на Node.js , использует Express , MongoDB , Redis , развернут через Docker и имеет автоматический деплой через CI/CD pipeline .

Внезапно после очередного деплоя:

"Пользователи не могут сохранять новые задачи", "Падает API", "Запросы к /tasks завершаются ошибкой 500", "Мониторинг показывает рост latency до 10 секунд"

Вас вызвали на экстренный инцидентный чат. Нужно быстро найти проблему , устранить её и предотвратить повторение .

 

Роли в команде :

Роль
Основные задачи
Ключевые навыки и ответственность
Backend-разработчик
Анализ кода, поиск багов, проверка входных данных, бизнес-логики
Умение читать Node.js-код, находить утечки памяти, блокировки, невалидные запросы, ошибки в ORM
DevOps-инженер
Проверка состояния контейнеров, Docker, Kubernetes, Nginx, health-check'ов
Знание CI/CD, работа с логами, мониторингом, понимание сетевых политик, управление ресурсами
QA / Тестировщик
Воспроизведение ошибок, тестирование гипотез, поиск edge-case’ов
Умение воспроизводить запросы, работать с Postman/curl, находить граничные случаи, проверять корректность обработки ошибок
Инженер наблюдаемости (опционально)
Анализ логов, метрик, трейсов, выявление аномалий
Работа с ELK-стеком, OpenTelemetry, Prometheus, Grafana, понимание event loop delay, latency, error rate

Этапы игры:

Этап 1: Получение сигнала тревоги 

Команда получает сообщение:

"После последнего деплоя эндпоинт /tasks начал возвращать 500 ошибку. CPU usage = 98%, latency >10 секунд. Что произошло?"

Игроки получают:

  • Логи (error.log, access.log)
  • Графики метрик (CPU, memory, latency)
  • Фрагменты кода (например, новый middleware или изменённый route)
  • CI/CD pipeline (GitHub Actions или GitLab CI)
 

Этап 2: Диагностика 

Команда исследует:

  • Последние коммиты и изменения в коде
  • Логи (таймауты, ошибки БД, uncaught exceptions)
  • Метрики (event loop delay, memory leak, connection pool)
  • Конфигурации (Dockerfile, environment variables, Redis)
 

Этап 3: Выявление проблемы

Команда формулирует гипотезы:

  • В коде есть blocking operation
  • Новая версия сломала работу с БД
  • Не хватает пула соединений
  • Нарушена обратная совместимость API
  • Произошёл memory leak
 

Предлагают решения:

  • Откат до предыдущей версии
  • Увеличение пула БД
  • Исправление асинхронности
  • Добавление graceful shutdown
  • Настройка alert'ов и health check'ов
 

Этап 4: Incident Response 

Команда представляет:

  • Какую проблему они нашли
  • Как она повлияла на систему
  • Какие действия были выполнены
  • Какие практики будут внедрены, чтобы избежать подобного в будущем
 

Преподаватель может имитировать:

  • Пользовательские жалобы
  • Давление от менеджмента ("Нам нужен ответ сейчас!")
  • Сложности при откате
 

Обучающие эффекты:

  • Навык анализа логов и метрик в реальном времени
  • Умение читать CI/CD pipeline и понимать, что было задеплоено
  • Знание типичных ошибок в Node.js (memory leak, blocking code, bad queries)
  • Опыт incident response : от диагностики до исправления
  • Понимание важности health check'ов, alert'ов, graceful shutdown
  • Навык принятия решений под давлением
 

Примеры скрытых проблем (карточки):

Категория
Проблема
Возможное решение
Асинхронность
Блокирующая операция в основном потокеfs.readFileSync
Переписать наfs.promises.readFile()или использовать Worker
База данных
Новый запрос без индекса привёл к full scan
Добавить индекс, оптимизировать запрос
CI/CD
Обновление зависимости сломало совместимость
Откат до предыдущей версии, добавление тестов
Память
Memory leak из-за подписки на события без отписки
Использовать.once()или явно вызывать.off()добавить profiling
Мониторинг
Нет alert'ов на высокий уровень ошибок
Настроить alert в Prometheus/Grafana
Архитектура
Некорректная миграция логики между микросервисами
Проверить контракты, добавить schema validation
Конфигурация
Неправильная переменная окружения в staging
Проверить .env файлы, добавить валидацию

Материалы для игры:

  • Примеры логов (error, warn, info)
  • Фрагменты кода с проблемами
  • CI/CD конфигурации (GitHub Actions, Jenkins)
  • Примеры метрик (Prometheus, Grafana dashboard)
  • Шаблон Incident Report:
    • Что случилось
    • Почему это произошло
    • Как решили
    • Как предотвратить
 

Возможные проблемы во время игры:

  • Игроки не могут связать логи с кодом
  • Команда не видит связи между метриками и событиями
  • Предлагают масштабирование вместо фикса
 

Как решить:

  • Подбрасывайте подсказки: «Проверьте, что изменилось», «Посмотрите на последний коммит»
  • Спрашивайте: «Что изменилось в этом релизе?», «Какова цепочка вызовов?»
 

Интеллект-карта 1: «Путь бэкенд-разработчика на Node.js»

Ветки:

  • Ядро Node.js

    • Event Loop
    • Асинхронное программирование (callback → promise → async/await)
    • Работа с модулями (CommonJS / ESM)
    • Встроенные модулиfspathosstreamhttp
  • Серверная логика

    • Express.js / NestJS
    • Роутинг и middleware
    • Обработка запросов и ответов
    • Маршруты, контроллеры, сервисы
  • Работа с данными

    • REST API / GraphQL
    • Базы данных: SQL (PostgreSQL), NoSQL (MongoDB), In-memory (Redis)
    • ORM (Sequelize, TypeORM, Mongoose)
    • Миграции, транзакции, пул соединений
  • Аутентификация и безопасность

    • JWT, OAuth2, Session Auth
    • Защита от SQLi, XSS, CSRF
    • Helmet, rate limiting, CORS
    • Авторизация через RBAC, ABAC
  • Тестирование

    • Unit-тесты (Jest, Mocha)
    • Интеграционные тесты
    • Тестирование API (Supertest)
    • Mocking, spies, stubs
  • Контейнеризация и деплой

    • Docker
    • Docker Compose
    • CI/CD (GitHub Actions, GitLab CI)
    • Kubernetes (опционально)
  • Микросервисная архитектура

    • Основы микросервисов
    • Service discovery
    • Коммуникация: REST, gRPC, message brokers
    • Circuit breaker, retry logic
  • Наблюдаемость и производительность

    • Логирование (Winston, Pino)
    • Мониторинг (Prometheus, Grafana)
    • Tracing (OpenTelemetry)
    • Профилирование и оптимизация кода
 

Интеллект-карта 2: «От идеи до production»

Ветки:

  • Идея и проектирование

    • Сбор требований
    • Выбор архитектуры (monolith vs microservices)
    • Дизайн API (REST / GraphQL)
  • Разработка

    • Node.js + Express / NestJS
    • Работа с базами данных
    • Аутентификация и авторизация
    • Паттерны проектирования
  • Тестирование

    • Unit-тесты
    • Интеграционные тесты
    • End-to-end тесты
    • Автоматизированное тестирование
  • Деплой и инфраструктура

    • Docker
    • CI/CD pipeline
    • Nginx / API Gateway
    • Cloud провайдеры (AWS, Heroku, GCP)
  • Наблюдение и поддержка

    • Логирование
    • Мониторинг
    • Alerting
    • Incident response
 

Интеллект-карта 3: «Технологии и инструменты бэкенд-разработчика»

Ветки:

  • Node.js ядро

    • Event Loop
    • Streams
    • Buffers
    • Child processes
    • Cluster module
  • Фреймворки

    • Express
    • NestJS
    • Fastify
    • Koa
  • API

    • REST
    • GraphQL
    • OpenAPI / Swagger
  • Базы данных

    • PostgreSQL
    • MongoDB
    • Redis
    • MySQL
    • ORM: Sequelize, TypeORM, Mongoose
  • Авторизация и безопасность

    • JWT
    • Passport.js
    • Rate limiting
    • Helmet
    • OAuth2
  • Тестирование

    • Jest
    • Mocha / Chai
    • Supertest
    • Postman / Newman
  • Контейнеризация и оркестрация

    • Docker
    • Docker Compose
    • Kubernetes
    • Helm (опционально)
  • CI/CD

    • GitHub Actions
    • GitLab CI
    • Jenkins
    • Travis CI
  • Наблюдаемость

    • Winston / Pino
    • Prometheus / Grafana
    • Sentry / Datadog
    • ELK Stack
  • Микросервисы

    • gRPC
    • RabbitMQ / Kafka
    • Consul / etcd
    • Istio / Linkerd
 

Интеллект-карта 4: «Путь от новичка до профессионала»

Ветки:

  • Уровень 1: Начальный

    • JS глубоко (замыкания, this, прототипы)
    • Node.js: установка, CLI, npm
    • Первые HTTP-серверы
    • Работа с файлами и потоками
  • Уровень 2: Промежуточный

    • Express.js: маршруты, middleware
    • Работа с БД
    • Асинхронность и промисы
    • REST API
  • Уровень 3: Продвинутый

    • NestJS
    • TypeScript
    • Тестирование (unit, e2e)
    • Архитектурные паттерны (MVC, CQRS, Repository)
    • Аутентификация и безопасность
  • Уровень 4: Профессиональный

    • Микросервисы
    • CI/CD
    • Контейнеризация
    • Сервис-дискавери и мониторинг
    • Производительность, кэширование, resilience

1. "Node.js Design Patterns" — Mario Casciaro

  • Описание:
    Один из самых уважаемых источников по архитектуре и паттернам проектирования в Node.js. Книга охватывает асинхронное программирование, потоки данных, модульность, микросервисы, тестирование и оптимизацию приложений.

  • Для кого:
    Для разработчиков с базовым уровнем знаний Node.js, желающих выйти на профессиональный уровень.

  • Что взять отсюда в курс:
    Главы по event-driven архитектуре, streams, cluster module, шаблонам проектирования (MVC, Repository), микросервисам и работе с контейнерами.

 

2. "Professional Node.js: Building JavaScript Based Scalable Software" — Pedro Teixeira

  • Описание:
    Углублённое руководство по созданию масштабируемых backend-приложений. Включает работу с Express, MongoDB, Redis, REST API, тестированием, CI/CD, Docker и облачными технологиями.

  • Для кого:
    Для бэкенд-разработчиков, уже знакомых с основами JS и Node.js.

  • Что взять отсюда в курс:
    Практические примеры построения серверных приложений, работа с базами данных, организация CI/CD, использование NPM на продвинутом уровне.

 

3. "Node.js в действии" — Майк Уилсон, Брэд Гринсби, Эоин Мартино

  • Описание:
    Русскоязычная версия книги, раскрывающая практические аспекты разработки на Node.js: HTTP-серверы, маршрутизация, безопасность, работа с БД, WebSocket, интеграция с внешними сервисами.

  • Для кого:
    Для разработчиков, осваивающих Node.js для реальных проектов.

  • Что взять отсюда в курс:
    Примеры реализации REST API, работы с PostgreSQL и MongoDB, использования Express и Socket.io, настройки безопасности и деплоя.

 

4. "Building Microservices with Node.js" — Diogo Gomes

  • Описание:
    Книга посвящена проектированию и реализации микросервисной архитектуры на Node.js. Рассматривает коммуникацию между сервисами, управление состоянием, service discovery, отказоустойчивость и мониторинг.

  • Для кого:
    Для опытных разработчиков, переходящих к распределённым системам.

  • Что взять отсюда в курс:
    Реальные примеры реализации микросервисов, обмен данными через REST/gRPC, использование Docker/Kubernetes, подходы к логированию и tracing.

 

5. Методические рекомендации: "Практикум по разработке backend на Node.js" (авторские)

  • Описание:
    Авторский практикум, написанный специально для курса «Бэкенд-разработчик Node.js (Профессиональный уровень)». Содержит:

    • Дидактические задачи
    • Тестовые задания
    • Кейсы для анализа
    • Лабораторные работы
    • Инструкции по CI/CD, Docker, NestJS, GraphQL
  • Формат:
    PDF + исходники на GitHub

  • Где использовать:
    Как основное учебное пособие для выполнения практических работ и домашних заданий.

  • Содержание:

    • Проектирование API
    • Аутентификация и авторизация
    • Работа с ORM
    • Построение микросервисов
    • Написание unit и интеграционных тестов
    • Настройка Docker и CI/CD
    • Обработка ошибок и graceful shutdown
    • Использование Redis, RabbitMQ, Kafka

1. Node.js Pro: Профессиональная бэкенд-разработка
Научитесь создавать высокопроизводительные, отказоустойчивые backend-приложения на Node.js с применением современных инструментов и паттернов проектирования.

 

2. Мастер Node.js: Бэкенд для масштабируемых приложений
Освойте разработку серверной логики, работу с микросервисами, контейнеризацию и деплой в production-среду.

 

3. Node.js для профессионалов: От REST к микросервисам
Изучите продвинутые методы создания API, работы с базами данных, тестирования, CI/CD и перехода к распределённым системам.

 

4. Разработка backend-сервисов на Node.js (Professional)
Глубокое погружение в серверную разработку: Express, NestJS, GraphQL, PostgreSQL, Docker, Kubernetes и DevOps-практики.

 

5. Node.js Engineering: Профессиональная backend-архитектура
Обучение построению надёжных, тестируемых и легко масштабируемых backend-решений с использованием современных подходов и практик.

 

6. Node.js Full Stack Pro: Серверная часть от новичка до эксперта
Углублённое изучение backend-разработки на Node.js: REST, GraphQL, ORM, безопасность, тестирование, микросервисы, CI/CD.

 

7. Node.js для Enterprise: Бэкенд в сложных системах
Подготовка к работе в корпоративной среде: устойчивость, производительность, мониторинг, микросервисы, service mesh и интеграция с legacy-системами.

 

8. Node.js Backend Developer: Профессиональный уровень
Интенсив по созданию и сопровождению backend-приложений в реальных условиях: от проектирования до деплоя и мониторинга.

 

9. Node.js Architect: Масштабируемый backend с нуля
Практический курс по созданию архитектур, которые выдерживают нагрузку, легко развёртываются и поддерживаются в течение долгого времени.

 

10. Node.js в продакшене: Разработка и сопровождение сервисов
Обучение написанию production-ready кода: обработка ошибок, логирование, tracing, graceful shutdown, health check и другие best practices.

 

11. Node.js для опытных разработчиков: Следующий уровень
Углублённое изучение асинхронности, потоков, микросервисов, тестирования и оптимизации производительности.

 

12. Создание backend-сервисов на Node.js (Профессиональный уровень)
Курс для тех, кто хочет освоить разработку масштабируемых, отказоустойчивых и поддерживаемых backend-приложений на Node.js.

 

13. Node.js для Full-stack разработчиков: Продвинутая бэкенд-часть
Фокус на серверной части: работа с базами данных, аутентификация, API, микросервисы, контейнеризация и автоматизация.

 

14. Node.js как основа backend-архитектуры
Изучение Node.js как центрального элемента backend-инфраструктуры: от проектирования до оркестрации в облаке.

 

15. Node.js в реальной разработке: От теории к практике
Курс, ориентированный на применение Node.js в реальных проектах: от REST API до микросервисов и CI/CD.

 

16. Node.js: Создание и обслуживание backend-приложений
Полный цикл разработки backend-приложений: проектирование, реализация, тестирование, деплой и сопровождение.

 

17. Node.js в масштабируемой архитектуре
Изучение принципов создания сервисов, способных выдерживать высокую нагрузку, с возможностью горизонтального масштабирования.

 

18. Node.js и микросервисы: Построение распределённых систем
Курс по проектированию и реализации микросервисной архитектуры на основе Node.js и современных инструментов.

 

19. Node.js: Современный бэкенд для опытных разработчиков
Углублённое обучение разработке backend-приложений с акцентом на качество кода, тестирование и наблюдаемость.

 

20. Node.js: Построение backend-сервисов уровня enterprise
Курс по разработке промышленного уровня: от проектирования до внедрения в крупные системы.

 

21. Node.js для DevOps: Интеграция, деплой и мониторинг
Обучение разработке backend-сервисов с учётом требований DevOps: контейнеризация, CI/CD, мониторинг и автоматизация.

 

22. Node.js: Разработка backend-приложений в команде
Курс, фокусирующийся на совместной разработке: Git Flow, code review, документация, управление зависимостями и модульность.

 

23. Node.js: Разработка API по стандартам OpenAPI / Swagger
Обучение созданию качественных REST API с документацией, тестированием и соблюдением стандартов.

 

24. Node.js: Бэкенд-разработка в условиях высокой нагрузки
Изучение методов повышения производительности, оптимизации event loop, кэширования, пулов соединений и resilience.

 

25. Node.js: От REST к GraphQL — следующий этап развития API
Курс по переходу от REST к GraphQL: типы, схемы, resolver'ы, защита, кэширование и интеграция с клиентскими фреймворками.

Заявка ученика, студента, слушателя
Заявка преподавателя, репетитора админу сети.
18:07
11
Посещая этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.