Регулирование SQS, чтобы максимум 1 сообщение в полете пересекало всех подписчиков? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть ситуация, когда я запускаю длительный процесс на микросервисе с помощью сообщения sqs.У меня есть несколько экземпляров одного и того же микросервиса, но я хочу, чтобы только один экземпляр запускал задачу.Можно ли указать, что очередь должна доставить только 1 сообщение и дождаться ответа абонента или достижения тайм-аута видимости?

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Я хочу отправить одно сообщение только подписчику А и дождаться, пока подписчик А полностью обработает сообщение или пока не истечет время ожидания.Я не могу понять, как избежать, чтобы subscriberB забрал другое сообщение из очереди, пока не будет завершен subscriberA

Странно, что у вас такая архитектура.Это будет использовать одного абонента за раз, поэтому парк микросервисов подписчик / несколько экземпляров не подходит.

Если это возможно, просто позвольте одному из ваших микросервисов подписаться / опросить очередь

В противном случае вам придется это делать самостоятельно.Мое предложение:

  • Есть две очереди.Одна из очереди будет получать все сообщения.Одна из очередей будет доставлять сообщение вашим подписчикам.Ваша кодовая база не должна будет сильно меняться, если она настроена следующим образом
  • Настройка лямбда-функции, запускаемой Receiving-SQS. Установите параллелизм этой функции на 1, настройте задержку доставки вашего SQS на газ, как вы хотите
  • Функция должна будет проверить Serving-SQS, есть ли сообщение в этой очереди(Ожидание или обработка) через API GetQueueAttributes
  • Отправьте сообщение Serving-SQS, если оно бесплатное, или верните сообщение обратно в Receiving-SQS
0 голосов
/ 18 декабря 2018

SQS уже делает это для вас.Атрибут «тайм-аут видимости» гарантирует, что задача видна только одному работнику, если вы выровняете ее с максимальным временем выполнения.

Рабочий извлечет объект из SQS.SQS гарантирует, что он будет доставлен только один раз и невидим для других во время тайм-аута видимости.Вы должны дать максимальное время выполнения задачи.Скажем 5 минут.И установите более высокий тайм-аут видимости.Скажем 6 минут.По истечении этого времени, если работник не выполнил задание успешно, элемент будет невидим для других в течение еще одной минуты, а затем вернется в очередь.После этого другой работник может забрать сообщение, и оно снова станет невидимым для других в течение 6 минут.В случае успеха рабочий должен удалить сообщение.

Таким образом, вы гарантируете, что каждый элемент получит только обработанные.

...