Лично я не фанат использования брокера сообщений для RPC.Это добавляет ненужные сложности и накладные расходы.
Как вы размещаете своего долгоживущего потребителя RabbitMQ в своем веб-сервисе Users?Если вы сделаете это статическим синглтоном, как вы будете работать с масштабированием и параллелизмом в веб-сервисе?Или вы делаете это автономным процессом демона?Теперь у вас есть два пользовательских приложения вместо одного.Что произойдет, если ваш потребитель Users замедлится, к тому времени, когда он получит сообщение-запрос, контекст службы заказов мог истечь и отправил другое сообщение или отказался.
Для RPC я бы предложил простой HTTP.
Существует шаблон с участием брокера сообщений, который может избежать необходимости синхронного сетевого вызова.Шаблон предназначен для сервисов, которые используют события от других сервисов и хранят эти данные локально в своей собственной базе данных.Затем, когда приходит время, когда службе Orders требуется запись пользователя, она может получить к ней доступ из своей собственной базы данных.
В вашем случае вашему приложению Users не нужно ничего знать о заказах, но ваше приложение Orders требуетзнать некоторые детали о ваших пользователях.Таким образом, каждый раз, когда пользователь добавляется, изменяется, удаляется и т. Д., Служба «Пользователи» генерирует событие (UserCreated, UserModified, UserRemoved).Служба Orders может подписаться на эти события и хранить только те данные, которые ей необходимы, например, адрес пользователя.
Преимущество заключается в том, что во время запроса ваша служба Orders имеет одну менее синхронную зависимость от другой службы.Тестировать сервис проще, поскольку у вас меньше зависимостей от времени запроса.Однако есть и недостатки, такие как некоторая задержка между изменениями записей пользователей, которые происходят и принимаются приложением Orders.Что следует учесть.
ОБНОВЛЕНИЕ Если вы используете RabbitMQ для RPC, не забудьте использовать функцию TTL для сообщений.Если время ожидания клиента истекло, установите срок действия сообщения на этот период.Это поможет избежать бесполезной работы со стороны потребителя и избежать резервного копирования очереди под нагрузкой.Одна из проблем, связанных с RPC через посредник сообщений, заключается в том, что, как только очередь заполняется, она может добавить большие задержки, для восстановления которых требуется некоторое время.Установка истечения срока действия вашего сообщения на тайм-аут клиента помогает избежать этого.
Относительно RabbitMQ для RPC.Обычно мы используем брокер сообщений для разделения и долговечности.Поскольку RPC является синхронной связью, то есть мы ждем ответа, тогда долговечность не рассматривается.Это оставляет нас отделенными.Вопрос в том, что развязка покупает вам что-нибудь помимо развязки, которую вы можете делать с HTTP через шлюз или имена сервисов Docker?