Как ломается модульный монолит и как с этим бороться
The article explains how a modular monolith loses its internal boundaries. In microservices, process and storage boundaries keep logical boundaries in place, and crossing them requires an explicit remote call, a contract and updates to at least two services. In a monolith, no mechanism enforces logical boundaries: one part of the code can reference another at any moment, and the build and tests will let it pass. Even at runtime the system may work without errors.
В микросервисах логические границы удерживаются границами процесса и хранилища. Для пересечения надо явно написать удаленный вызов, сделать контракт и обновить как минимум два сервиса. В монолите нет механизма контроля логических границ. Одна часть кода в любой момент может сослаться на другую, сборка и тесты это пропустят. Даже в рантайме может может все работать без ошибок. Но таких ссылок станет много и монолит превратится в big-ball-of-mud. Эти же явные границы микросервисов помогают настраивать деплой. Структура сервисов и их зависимости видны в коде (не всегда очевидно, но всегда явно) и “случайно” их нарушить сложно. В модульном монолите структура деплоя не отражена вообще. В прошлой статье я описал как сделать контроль зависимостей между модулями в рантайме, но хотелось бы раньше. Закончил статью списком поломок, которые не замечают ни сборка, ни локальная отладка. В этой статье я покажу как превратить ошибки нарушения границ и деплоя в ошибки компиляции и красные тесты . Читать далее