Какие архитектурные шаблоны существуют
Что проверяют
Различаете ли вы архитектурные шаблоны и паттерны проектирования, и знаете ли, как они выглядят в Node.js с его однопоточным event loop. Следом обычно спрашивают, как вы структурируете сервис на Express или NestJS и куда кладёте бизнес-логику.
Как отвечать
Разведите уровни. Уровень системы:
- монолит и модульный монолит: один процесс, модули с явными границами. Для большинства Node.js-сервисов правильный старт;
- микросервисы: независимые сервисы со своими базами, связь через HTTP, gRPC или брокер. Цена: сеть, распределённые данные, эксплуатация;
- событийно-ориентированная: сервисы общаются событиями через Kafka, RabbitMQ или Redis Streams, фоновые задачи идут через очереди вроде BullMQ;
- serverless: функции под события, у Node.js здесь сравнительно быстрый холодный старт.
Уровень приложения:
- слоистая архитектура: контроллер принимает HTTP, сервис держит бизнес-логику, репозиторий работает с базой. Роут-хендлер в Express должен быть тонким;
- гексагональная и Clean Architecture: домен не знает про Express, Prisma или конкретный брокер, всё подключается через интерфейсы;
- MVC: исторически популярен в Express с шаблонизаторами, в API-сервисах чаще встречается просто разделение на слои;
- модульная структура NestJS: модули, провайдеры и внедрение зависимостей, для CQRS есть пакет
@nestjs/cqrs.
Специфика Node.js стоит отдельной фразы: middleware в Express и Koa это цепочка обработчиков, EventEmitter реализует наблюдателя, а тяжёлые вычисления выносят в worker_threads или отдельный сервис, чтобы не блокировать event loop. Горизонтально масштабируются несколькими процессами: cluster, PM2 или реплики в Kubernetes.
Где спотыкаются
Называют npm-пакеты модульной архитектурой. Пакет это единица поставки, а архитектура про границы и зависимости внутри вашего кода.
Смешивают архитектурные шаблоны с паттернами GoF: синглтон и фабрика не отвечают на вопрос, как устроена система.
Держат всю логику в роут-хендлерах и называют это «клиент-сервером». Такой код не протестировать без HTTP, и это вскроется на первом же уточнении.