Существует ли шаблон для синхронизации обмена сообщениями в очереди сообщений с запросом / ответом вручную?

#asynchronous #design-patterns #synchronization

#асинхронный #дизайн-шаблоны #синхронизация #шаблоны проектирования

Вопрос:

Давайте представим, что у меня есть REST API с конечной точкой /api/status . При обращении к этой конечной точке API отправляет сообщение в очередь сообщений, запрашивая статус какой-либо другой службы.

Затем в ответ служба отправляет сообщение со своим статусом в очередь, которую прослушивает REST API. Итак, для запроса статуса требуется одно сообщение и одно ответное сообщение.

Мой вопрос таков: Существует ли шаблон проектирования для преобразования асинхронного характера этого подхода в синхронный в API? Другими словами: существует ли шаблон, который GetStatus(...) метод в псевдокоде ниже может реализовать для синхронизации получения статуса с обменом данными через несколько очередей сообщений или даже pub / подсистем.

 var statusRequestMsg = "get_status";
var statusResponseMsg = GetStatus(statusRequestMsg);
  

Я знаю, как решить это в коде, но мне было любопытно, существует ли шаблон проектирования, который вводит общий подход.

Я много гуглил в поисках этого, но единственное, что я нашел, было очень техническое объяснение подхода к этому в этой статье: Модель связи для интеграции парадигм запроса-ответа и публикации-подписки в повсеместные системы

Пожалуйста, обратите внимание, что я понимаю, что это не идеальный дизайн API и что существуют лучшие способы реализации примера. Я создал приведенный выше пример, чтобы помочь мне проиллюстрировать свой вопрос. Также я понимаю, что некоторые AMQP подразумевают. (например, RabbitMQ) предоставляет способ синхронизации обмена MQ со стилем запроса / ответа.

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

Комментарии:

1. Нашли ли вы наконец ответ на этот вопрос? Я хочу создать метод запроса-ответа на вход, где login — это ожидаемая асинхронная операция с маркером отмены и таймаутом. Моя ide заключается в вызове удаленной службы из моего метода входа в систему, затем зависании до тех пор, пока не придет сообщение (отдельный канал). Возобновите сеанс входа в систему на основе correlationid и возобновите первоначальный вызов. Не могу найти ответа на этот вопрос.

2. @Тедди, я согласился с предложением Александра Тейлора о шаблоне Microsoft Async Запрос-ответ: learn.microsoft.com/en-us/azure/architecture/patterns /…

Ответ №1:

Microsoft называет это шаблоном асинхронного запроса-ответа и использует решение, которое опрашивает по HTTP:https://learn.microsoft.com/en-us/azure/architecture/patterns/async-request-reply

Я полагаю, что должно быть возможно избежать опроса, подписавшись на обновления для ключа. Например, в Redis можно подписаться на обновления для одного ключа с помощью уведомлений в пространстве ключей (На странице упоминаются два предостережения: что «все события, доставленные во время отключения клиента, теряются» и «уведомления о событиях не передаются на все узлы».)

Ответ №2:

Рассматривали ли вы что-то подобное:

  1. Запрос поступает
  2. Создайте идентификатор корреляции
  3. Отправьте идентификатор корреляции другой службе как часть сообщения, отправленного через очередь
  4. Начните опрос для этого идентификатора в каком-либо хранилище данных (скажем, Redis)

Время истекает…

  1. Отправьте идентификатор корреляции обратно исходной службе вместе с результатом запроса в сообщении, отправленном через очередь
  2. Рабочая очередь чтения устанавливает значение идентификатора корреляции в хранилище данных в качестве результата асинхронного запроса
  3. Опрос обнаруживает результат и возвращает в качестве ответа на запрос

Сработает ли это?

Комментарии:

1. Да, хорошее предложение. Фактически это то, как я реализовал, но без Redis atm. В моем вопросе спрашивается, существует ли на самом деле название шаблона для такого подхода к синхронизации сообщений, похожих на запрос-ответ, между службами.

2. Я не знаю названия для синхронной стороны этого. Но асинхронный бит называется шаблоном асинхронный запрос-ответ: enterpriseintegrationpatterns.com/patterns/conversation /…

3. В качестве альтернативы, рассматривали ли вы удаленный вызов процедуры, а не асинхронное сообщение?