Как раз нужно бить по инвариантам. А когда стейт не дробишь, что каждой функции приходится контролить все инварианты.
Ссылка которую я привел - там как раз об этом. И дистрибьютед становится легче
там статья не про это, а про ёбаный CQRS, что как раз и является
"архитектурной задачей"
я не знаю, сколько готовых архитектур ты перевёл на CQRS, но это полный пиздец и рекомендуется воздерживаться от этого, пока совершенно не припрёт
лучше на коболе и голанге все сервисы писать, чем перевести всё дружно на CQRS просто, чтобы можно было offer.addContractor(p) написать