Монолит
Тема дорожной карты · Software Architecture
Монолитная архитектура представляет собой подход к разработке программного обеспечения, при котором все функции приложения объединены в один исполняемый артефакт, например, один JAR-файл или один Docker-образ. Такой подход имеет ряд преимуществ, таких как простота развертывания, отладки и управления транзакциями. Однако, с ростом кодовой базы и усложнением структуры приложения, управление монолитом становится все сложнее.
Монолиты часто используются в современных системах, где они могут работать на горизонтальном масштабировании и с использованием кэш-слоя, что позволяет эффективно обслуживать большое количество пользователей.
Как это работает
Монолитная архитектура строится с сильными внутренними границами модулей, что обеспечивает более четкое разделение ответственности между различными частями приложения. Это позволяет командам разработчиков сосредоточиться на конкретных модулях, а не на всем приложении целиком. Используются единую базу данных с четкими границами владения таблицами между модулями, что упрощает управление данными и минимизирует конфликты между модулями.
Для масштабирования монолитов используются горизонтальные методы, такие как добавление новых инстансов приложения за балансировщиком нагрузки. Это позволяет эффективно распределить нагрузку между несколькими экземплярами приложения. Также используются кэширование hot paths, чтобы ускорить доступ к часто используемым данным. Кэширование может быть реализовано с использованием Redis или других ин-процесс кэшей.
Когда применять
Монолитные архитектуры наиболее подходят для команд разработчиков, состоящих из 1-30 инженеров, а также для продуктов с относительно однородным профилем нагрузки. Это особенно полезно на ранних стадиях разработки, когда команда еще только открывает и изучает домен. Монолиты также могут быть полезны на более поздних стадиях разработки, когда требуется быстрое развертывание и тестирование функций.
Типичные ошибки
- Spaghetti monolith — отсутствие внутренних границ модулей, когда каждый файл импортирует из каждого, что приводит к сложному и трудному в поддержке коду.
- Преждевременное горизонтальное масштабирование — добавление балансировщика нагрузки и Redis до измерения, справляется ли одиночный экземпляр системы с текущей нагрузкой.
- 'Монолит означает медленность' — ложное утверждение на большинстве масштабов; монолиты часто оказываются быстрее микросервисов на той же нагрузке из-за отсутствия network hop.