теория
Смотри, вот что важно осознать раньше всякого кода. Пока Платежи жили внутри монолита, обращение к ним было обычным вызовом функции: мгновенным и честным — либо выполнился, либо тут же бросил исключение, и ты сразу знаешь, что случилось. Вынеси их за сеть — и этот вызов меняет саму свою природу.
Во-первых, он больше не мгновенный. Сетевой вызов медленнее внутреннего в тысячи раз, и это не мелочь: то, что внутри процесса можно было дёргать сто раз в цикле, за сетью раздует задержку. Значит, контракт должен быть «крупным» — один заход за всем нужным, а не сто мелких вопросов.
Во-вторых, и это главное, — он может не ответить. Внутри процесса вызов либо возвращает результат, либо кидает ошибку. За сетью появляется третий, самый противный исход: — запрос уходит, а в ответ ни результата, ни ошибки. Просто тишина. Дошёл он или нет? Списал деньги или не успел? Ты не знаешь. И спроектировать придётся именно под это незнание.
В-третьих, исчезают общие таблицы. Раньше Платежи просто читали данные Заказов из той же базы. Теперь у каждого своя база, и то, что бралось напрямую, придётся спрашивать через явный — API или сообщение. Всё молчаливое знание, что текло через общие таблицы, всплывает на поверхность и требует, чтобы его назвали вслух.
Вынести сервис — значит принять эти три новых факта жизни. Дальше весь модуль про то, как с ними ужиться, а не делать вид, что сеть — это тот же вызов функции, только с задержкой.