Ответ
В 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) для тестируемости