Был ли ваш последний проект монолитной архитектурой?

Ответ

Проект использовал гибридную архитектуру: ядро было построено как микросервисы, но некоторые унаследованные модули сохраняли монолитные черты.

Почему был выбран гибридный подход?

  • Цель: Быстрый вывод 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 — наш, рынок — наш.
  • Минус, который потом вылезет: А попробуй-ка теперь этот монолитный модуль отдельно масштабировать или обновить без танцев с бубном? Пиздец. Все остальные сервисы ждут, пока этот левиафан перезапустится.

План на будущее, конечно, был: Типа, будем потихоньку выпиливать из этого монолита куски по бизнес-контекстам и делать из них нормальные микросервисы. В теории — красиво. На практике — это как отковыривать старую жвачку от стула: долго, муторно, и есть риск отковырять вместе с куском обивки.