Модульный монолит

Тема дорожной карты · Software Architecture

Модульный монолит представляет собой архитектурный подход, который сочетает в себе преимущества монолитного и микросервисного подходов. Этот подход позволяет командам разработчиков создавать сложные системы, сохраняя при этом управляемость и упрощая процесс деплоя. Модульный монолит особенно полезен для команд, которые находятся на стадии роста и могут столкнуться с необходимостью перехода к микросервисной архитектуре в будущем.

Как это работает

Модульный монолит строится на основе четко определенных модулей, каждый из которых имеет свои собственные пакеты и таблицы базы данных. Модули не должны зависеть друг от друга через общую изменяемую структуру данных. Вместо этого, они должны взаимодействовать через явные межмодульные API. Это позволяет каждому модулю функционировать как отдельная сущность, что упрощает их извлечение и преобразование в микросервисы, если это потребуется в будущем.

Принуждение к соблюдению границ модулей осуществляется с помощью специальных инструментов, таких как lint-правилами. Эти правила предотвращают импорт внутренних частей другого модуля, заставляя разработчиков использовать только публичные API модулей. Это помогает поддерживать чистоту и структурированность кода, что является ключевым фактором успеха модульного монолита.

Когда применять

Модульный монолит особенно полезен для команд разработки, состоящих из 5 до 30 инженеров. Этот подход особенно эффективен для команд, которые находятся на стадии роста и могут столкнуться с необходимостью разделения системы на микросервисы в будущем. Модульный монолит помогает избежать сложностей, связанных с управлением и деплоем монолитной системы, сохраняя при этом преимущества монолитной архитектуры, такие как простота управления версиями и более простая логика деплоя.

Типичные ошибки

  1. Границы модулей только на бумаге — без принуждения, границы модулей могут размыться, превращаясь в спагетти-код. Использование lint-правилами помогает предотвратить это.
  2. Shared mutable state между модулями — это убивает возможность извлечения модулей и делает переход к микросервисам невозможным. Каждый модуль должен иметь свою собственную изменяемую структуру данных.
  3. 'Всего одна маленькая cross-module зависимость' — даже небольшая зависимость между модулями может привести к сложностям при извлечении модуля. Каждое исключение размывает границу между модулями, делая их менее независимыми и более сложными для управления.

Связанные понятия

Полезные ресурсы