С какими архитектурными подходами вы работали в Node.js?

«С какими архитектурными подходами вы работали в Node.js?» — вопрос из категории Архитектура, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Node.js проектах применял различные архитектурные подходы в зависимости от масштаба и требований:

1. Layered Architecture (Controller-Service-Repository):

// Структура проекта
example-project/
├── controllers/
│   └── userController.js
├── services/
│   └── userService.js
├── repositories/
│   └── userRepository.js
├── models/
│   └── User.js
└── middleware/
    └── auth.js

// Пример сервиса
class UserService {
  constructor(userRepository) {
    this.userRepository = userRepository;
  }

  async createUser(userData) {
    // Бизнес-логика
    if (await this.userRepository.exists(userData.email)) {
      throw new Error('User already exists');
    }
    return this.userRepository.create(userData);
  }
}

2. Микросервисная архитектура:

  • Разделение на независимые сервисы (users, orders, payments)
  • Общение через HTTP/REST или message brokers (RabbitMQ, Kafka)
  • Каждый сервис со своей БД
  • Использовал Docker и Kubernetes для оркестрации

3. Event-Driven Architecture:

// Использование EventEmitter
const EventEmitter = require('events');
class OrderService extends EventEmitter {
  async processOrder(order) {
    // Обработка заказа
    this.emit('order_processed', { orderId: order.id });
  }
}

// Подписчики на события
orderService.on('order_processed', (data) => {
  notificationService.sendEmail(data.orderId);
  analyticsService.trackOrder(data.orderId);
});

4. Serverless/FaaS:

  • Разработка AWS Lambda функций на Node.js
  • Использование Vercel/Netlify функций
  • Плюсы: автоматическое масштабирование, pay-per-use

Ключевые принципы, которые соблюдаю:

  • Принцип единой ответственности (Single Responsibility)
  • Инверсия зависимостей через DI-контейнеры (Awilix, TSyringe)
  • Явные зависимости вместо глобальных require()
  • Порты и адаптеры (Hexagonal Architecture) для тестируемости