Ответ
Проект использовал гибридную архитектуру: ядро было построено как микросервисы, но некоторые унаследованные модули сохраняли монолитные черты.
Почему был выбран гибридный подход?
- Цель: Быстрый вывод MVP на рынок.
- Причина: Рефакторинг всего legacy-кода сразу был бы слишком затратным.
Сравнение частей системы:
| Компонент | Архитектура | Технологии | Причина |
|---|---|---|---|
| Сервис заказов | Монолитный модуль | Spring Boot, JPA, встроенная БД | Унаследованный код, тесная связность бизнес-логики. |
| Платежный сервис | Отдельный микросервис | Spring Boot, REST, отдельная БД | Необходимость независимого масштабирования и обновления. |
Пример монолитного модуля (упрощенно):
@Service
public class LegacyOrderService {
@Transactional
public Order processOrder(Order order) {
// Плотная связность: валидация, бизнес-логика, вызовы БД в одном месте
validate(order);
calculatePrice(order);
orderRepository.save(order);
inventoryService.updateStock(order); // Внутренний вызов
return order;
}
}
Плюсы и минусы подхода:
- Плюс: Высокая скорость разработки на начальном этапе.
- Минус: Сложности с изолированным масштабированием и развертыванием монолитных частей.
Эволюция: Архитектура предполагала постепенное выделение bounded context'ов из монолита в отдельные микросервисы.
Ответ 18+ 🔞
А, ну вот, классика жанра, блядь! Смотри-ка, у них тут архитектура получилась, как у моей первой тачки — с одной стороны новый движок вроде вставили, а с другой — коробка передач на соплях и изоленте, ебать мои старые костыли.
Короче, проект у них — гибрид, сука. То есть ядро — это вроде как модные, отдельные микросервисы, а некоторые модули — это такой монолитный legacy, который просто страшно трогать, а то рассыпется, блядь, в труху.
И че они, идиоты, так сделали?
- Цель была: Выкатить MVP на рынок быстрее, чем конкурент успеет сходить посрать. Скорость — всё.
- А причина простая: Переписать весь этот старый код разом — это ж овердохуища времени и денег. Легче было оставить самые страшные комки, где всё намертво переплетено, как корни у старого дуба.
Давай глянем, что у них там получилось:
| Компонент | Архитектура | Технологии | Причина (нормальными словами) |
|---|---|---|---|
| Сервис заказов | Монолитный комок | Spring Boot, JPA, встроенная БД | Старый код, который писал один чувак, который уже давно уволился. Там логика, валидация и вызовы к базе — всё в одной куче, как борщ в одной кастрюле. Распутывать — себя не уважать. |
| Платежный сервис | Отдельный микросервис | Spring Boot, REST, своя БД | А вот это уже умно. Его надо часто обновлять и масштабировать отдельно, чтобы когда все ринутся покупать, он не лег, как опоенный таракан. |
Вот, полюбуйся, как выглядит этот legacy-монолит (упрощённо, а то реальный код глаза выест):
@Service
public class LegacyOrderService {
@Transactional
public Order processOrder(Order order) {
// Всё в одном методе, ёпта! И проверить, и посчитать, и в базу пихнуть, и остатки на складе поправить.
validate(order);
calculatePrice(order);
orderRepository.save(order);
inventoryService.updateStock(order); // И это не внешний вызов, а внутренний, из того же монолита!
return order;
}
}
Что в итоге имеем, блядь?
- Плюс один, но жирный: На старте ебашили как угорелые и быстро что-то рабочее выкатили. MVP — наш, рынок — наш.
- Минус, который потом вылезет: А попробуй-ка теперь этот монолитный модуль отдельно масштабировать или обновить без танцев с бубном? Пиздец. Все остальные сервисы ждут, пока этот левиафан перезапустится.
План на будущее, конечно, был: Типа, будем потихоньку выпиливать из этого монолита куски по бизнес-контекстам и делать из них нормальные микросервисы. В теории — красиво. На практике — это как отковыривать старую жвачку от стула: долго, муторно, и есть риск отковырять вместе с куском обивки.