Для такого рода требований будет лучше, если клиент будет получать промежуточный ответ, а не возвращать окончательный ответ. Чтобы это работало, я бы сделал так, чтобы запрос клиента обрабатывался асинхронно.
Проще говоря, служба A и служба B действуют как потребители, прослушивающие очереди QueueA
и QueueB
соответственно на службе брокера сообщений (ActiveMQ, RabitMQ и т.д.) Будет еще одна служба, называемая API службой, которая прослушивает запросы клиентов. Этот сервис также будет иметь свою собственную БД, поддерживающую статус задач (API БД). Служба A и служба B также будут иметь доступ к DB API.
При такой схеме вот как обрабатывается запрос, когда он отправлен клиентом:
In Progress
. Затем он отправит запрос на QueueA
. Идентификатор задачи будет получен в качестве немедленного ответа.QueueB
. Он обновит API БД в соответствии с идентификатором задания.QueueB
, потребляет сообщение и обрабатывает его. В случае неудачи, информация о неудаче обновляется в DB API в соответствии с ID задачи в DB API как окончательный результат.На основании обновлений задания, выполненных службами A и B, статус задания будет либо Done
, либо Error
. Клиент, который опрашивает о завершении задания, получит окончательный результат в качестве ответа.
Рекомендую посмотреть эти видео для лучшего погружения в вопрос: