Ответ
Monolith First — это стратегия проектирования архитектуры, при которой разработка начинается с создания единого монолитного приложения, и только по мере роста и появления четких границ доменов оно может быть разбито на микросервисы.
Принципы и обоснование (по Мартину Фаулеру):
- Снижение начальной сложности: Микросервисы вводят значительную операционную и коммуникационную сложность (сеть, обнаружение сервисов, распределенные транзакции). Монолит позволяет сосредоточиться на бизнес-логике.
- Простота рефакторинга: В монолите легче изменять границы модулей, так как все компоненты находятся в одной кодовой базе и процессе.
- Выявление границ сервисов: Только в процессе разработки становятся видны естественные границы между модулями, которые позже можно превратить в микросервисы.
- Быстрый старт: Упрощает развертывание, отладку и сквозное тестирование на ранних этапах проекта.
Пример эволюции:
// 1. Монолит: все в одном приложении
@Service
public class OrderService {
@Autowired
private PaymentProcessor paymentProcessor;
@Autowired
private InventoryService inventoryService;
@Autowired
private NotificationService notificationService;
public void placeOrder(Order order) {
inventoryService.reserveItems(order);
paymentProcessor.charge(order); // Простой вызов метода
notificationService.sendConfirmation(order);
}
}
// 2. Со временем PaymentProcessor выделяется в отдельный микросервис.
// В монолите остается клиент для вызова этого сервиса по HTTP/gRPC.
Когда НЕ использовать Monolith First:
- Команда уже имеет большой опыт работы с микросервисами и DevOps-культурой.
- Требования к масштабированию отдельных компонентов сильно различаются с самого начала.
- Существуют заранее известные, стабильные и изолированные бизнес-домены.
Вывод: Monolith First — это прагматичный подход, который признает, что «преждевременное разбиение на сервисы может быть так же вредно, как и преждевременная оптимизация».