Асинхронный шаблон запроса / ответа? - PullRequest
0 голосов
/ 26 апреля 2018

Я довольно новичок в микросервисах и асинхронных архитектурах, и мне интересно, как типичный запрос / ответ работает в таких средах.

Пример 1:

  1. Скажем, у меня есть веб-приложение, которое отправляет запрос POST в / example / doStuff и ожидает ответа, сообщающего ему, был ли этот запрос выполнен успешно или нет.
  2. Обработка api / doStuff в Microservice A имеет логику, которая говорит, что всякий раз, когда запрашивается / doStuff, отправьте сообщение о событии doStuffInitiated брокеру сообщений.
  3. В результате события doStuffInitiated микросервисы B и C реагируют на это сообщение, устанавливая флаг в БД и т. Д., И выдают брокеру сообщение doStuffCompleted
  4. Вот где я застрял : есть ли способ сделать микросервис Ожидание использования doStuffCompleted перед отправкой ответа обратно в веб-приложение, которое сделало исходный запрос? Это даже правильный путь?

Пример 2:

  1. Клиентское веб-приложение отправляет запрос GET на / example / getStuff
  2. Microservice API обрабатывает getStuff, отправляя событие stuffRequested в kafka.
  3. Чтобы данные возвращали объект «вещи», требуются данные из 2 внешних источников данных. Микросервис B отвечает за обработку этих двух источников данных, поэтому он использует событие stuffRequested , получает данные из двух источников данных и отправляет событие stuffRequestCompleted (вместе с «stuff») данные в полезной нагрузке) для использования микросервисом А, чтобы он мог вернуть объект «вещи» клиентскому приложению.
  4. Вот где я застрял : При асинхронном выполнении всего этого в фоновом режиме, как я могу "приостановить" отправку ответа, пока не смогу потреблять stuffRequestCompleted и отправлять обратно запрашиваемые данные?

Заранее спасибо.

1 Ответ

0 голосов
/ 27 апреля 2018

Вместо того, чтобы ждать завершения асинхронной части (я полагаю, что это антипаттерн), я бы незамедлительно ответил на запрос службы A, сообщив, что запрос получен, а процесс, стоящий за ним, запущен.

Тогда у вас есть два варианта:

  1. во внешнем интерфейсе периодически проверять (запрашивать) статус операции,
  2. реализовать взаимодействие сервера с клиентом с помощью веб-сокета.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...