Акцентирую одну из самых важных мыслей из
прошлого поста и приложу конкретный чеклист, который поможет объективно принять решение о выделение отдельного микросервиса / модуля
Человек очень плох в классификации и категоризации, и если ваша методолгия требует жесткой группировки (например, ООП или "деление по ответственности"), то вы никогда не сможете сделать это правильно
Почему? Потому что даже если вы смогли выделить конкретный набор фич по ответственности и разбить их на микросервисы / классы, которые удовлетворяют бизнес-задачам, мир не стоит на месте,
будут постоянно появляться новые требования, которые будут ооочень сильно размывать границы этой "ответственности" и
правильная архитектура сегодня, превращается в неправильную завтра и не по вашей вине
Ну, и конечно, вторая проблема: "ответственность" – очень субъективное понятие. Спроси в средней+ системе нескольких человек: "какие ответственности вы бы выделили?" – вариант каждого будет на 50% отличаться от другого. А повышение градума "субъективности" – путь бесконечных ошибок.
И любой человек, который делил микросервисы по ответственности в среднем+ проекте в итоге сталкивался, что они все вызывают друг друга миллионы раз и создают дедлупы
. А как правильно делитьДля начала определимся: "микросервис" содержит полностью отдельную кодовую базу и ресурсы и общается используя межсервисный транспорт, а "модуль" (модульного монолита) переиспользует кодовую базу и ресурсы другого модуля и может напрямую вызывать код соседнего модуля (без транспорта), но существует как отдельное приложение
Вот эту "примунную ответственность" разработчиком можно назвать "искуственной ответственностью", а нам нужно ориентироваться на "натуральную ответственность" и вот вам чеклист примеров этой "натруальной ответственности":
. Отдельная команда
Если есть две команды людей, который должны решать независимые части системы и не коммуницируют на постоянной основе (weekly, daily, свой менеджмент и т.д.), лучше чтобы каждые делали свой набор микросервисов / модулей и договаривались про API.
Даже общие библиотеки это опасно (должен быть 1 конкретный mainteiner этой либы), потому что любое вмешательство в код со стороны разраба из сторонней команды очень плохо контролируется и может деградировать пол системы
. Безопасность
Вы делаете модуль, занимающийся транзакциями, и хотите чтобы как можно меньше разработчиков не просто его разрабатывали или имели доступ, а даже видели код (для уменьшения потенциального взлома)
Тогда вы выделяете отдельный микросервис, со своим репозиторием и выдаете наружу только безопасный API.
(продолжение ниже)