Ответ
Преимущества:
- Простота разработки и развертывания: Одна кодовая база, одна база данных, один процесс развертывания.
- Простота тестирования: Все компоненты находятся в одном процессе, что упрощает модульное и интеграционное тестирование, минимизирует необходимость в моках.
- Производительность: Отсутствуют накладные расходы на сетевые вызовы между компонентами, так как взаимодействие происходит через вызовы методов в памяти.
- Согласованность данных: Проще обеспечить ACID-транзакции, так как обычно используется одна база данных.
Недостатки:
- Сложность масштабирования: Масштабируется только вся система целиком, нельзя увеличить ресурсы для отдельного модуля.
- Высокая связность: Изменения в одном модуле могут неожиданно сломать другие, система становится "хрупкой".
- Медленный цикл разработки: Любое изменение, даже незначительное, требует полной пересборки и повторного развертывания всего приложения.
- Препятствия для технологического обновления: Сложно внедрить новые технологии или фреймворки в рамках всего монолита.
Пример монолитного процесса:
# Все функции бизнес-логики в одном модуле
class OrderProcessor:
def process_order(self, order):
# Высокая связность: изменение в любом из этих шагов может повлиять на другие
self.validate(order) # Валидация
self.charge_payment(order) # Оплата
self.update_inventory(order) # Склад
self.ship_order(order) # Доставка
self.send_notification(order) # Уведомление
# Если send_notification() упадёт, весь заказ может остаться в несогласованном состоянии
Монолит хорошо подходит для небольших проектов или стартапов на ранней стадии, где важна скорость выхода на рынок, но с ростом проекта его поддержка становится всё сложнее.