Как использовать обмен сообщениями (Amazon SQS) в веб-api для возврата созданного идентификатора клиенту

#c# #amazon-web-services #asp.net-web-api #amazon-sqs #microservices

#c# #amazon-веб-сервисы #asp.net-web-api #amazon-sqs #микросервисы

Вопрос:

Только начинаю пользоваться сервисом Amazon SQS, поэтому просто интересно, может ли кто-нибудь направить меня в правильном направлении. В случае, если у меня есть интерфейс rest web-api, доступный клиентам, и после каждого http-запроса я хочу отправить асинхронное сообщение в мою отдельную службу, которая отвечает за создание определенного объекта в базе данных и обработку с некоторой логикой. Что-то вроде этого:

         var auctionRegistrationCommand = AuctionRegistrationCommand
            .CreateFromRequest(lotId, request);

        //var sqsClient = new AmazonSQSClient();
        //var response = sqsClient.SendMessageAsync(..resitrationCommaon..);
  

После создания объекта я хочу вернуть идентификатор созданного объекта своему клиенту, чтобы он мог использовать его для его обновления или выполнить дополнительный вызов rest api. Но я не могу найти, как это сделать. Существуют ли какие-либо шаблоны или подходы для поддержки таких сценариев? Было бы идеально посмотреть какой-нибудь пример использования Amazon SQS, но общее объяснение также будет очень полезным.

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

1. первая часть — это пример использования SQS, вторая часть — скорее пример использования SNS. Одним из простых способов было бы провести опрос клиента на предмет статуса.

2. При использовании одностороннего обмена сообщениями следует избегать синхронной связи. Клиент должен генерировать идентификатор (используя guid), а затем серверная часть может использовать его для создания вашей записи. Имеет смысл?

Ответ №1:

Допустим, ваши две системы — S1 и S2, где происходит следующее:

  1. S1 отправляет сообщение в SQS. Этот шаг является асинхронным.
  2. S2 создает требуемый объект.
  3. Ожидается, что S1 уведомит вызывающего абонента о вновь созданном идентификаторе объекта.

# 3 не является простым, учитывая саму природу асинхронных систем. Например, вы не знаете, когда S2 обработает ваш запрос.

Возможное решение:

  1. S1 отправляет сообщение в SQS. SQS возвращает a MessageId в ответ. Вы возвращаете это MessageId клиенту.
  2. Оба S1 и S2 имеют общее хранилище данных (например, Memcache, MySQL и т.д.), В котором хранится сопоставление MessageId с идентификатором объекта. Всякий раз, когда S2 обрабатывает сообщение и создает новый объект, он обновляет это сопоставление в общем хранилище данных.
  3. Клиенты опрашивают S1 с MessageId помощью . S1 возвращает сопоставление из хранилища данных всякий раз, когда оно не равно нулю.

Документацию по MessageId API SendMessage от SQS можно найти здесь .