Отправка и подтверждение службы очереди сообщений Amazon (SQS)

#amazon-web-services #amazon-sqs

#amazon-веб-сервисы #amazon-sqs

Вопрос:

Сценарий:

В среде elastic beanstalk есть несколько веб-серверов, Которые отправляют запрос в другую рабочую среду для регистрации пользователя и т. Д.

Проблема:

Когда одна из рабочих машин завершит задачу, я также хочу, чтобы она отправила подтверждение на веб-сервер.

Похоже, что у SQS нет сообщения «подтверждение».

Когда мы выгружаем задание для отправки электронной почты, но я также хочу сообщить веб-серверу, что отправка электронной почты прошла успешно.

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

Ответ №1:

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

  1. Веб-сервер отправляет сообщение с запросом.
  2. Рабочий получает сообщение.
  3. Рабочий успешно обрабатывает сообщение.
  4. Рабочий удаляет сообщение.

Удаляемое сообщение является подтверждением того, что оно было успешно обработано.

Если рабочий не удалит сообщение на шаге 4, то сообщение снова появится в очереди по истечении указанного времени ожидания, и следующий рабочий, который проверит наличие сообщений, получит его и обработает.

Если вы обеспокоены тем, что сообщение может оказаться невозможным для обработки и постоянно появляться в очереди, вы можете настроить очередь «мертвых писем». После того, как сообщение было получено указанное количество раз, но так и не было удалено, сообщение передается в очередь мертвых писем, где у вас может быть процесс для решения этих необычных ситуаций.

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

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

1. Спасибо за подробный ответ. Означает ли это, что веб-серверу также необходимо выполнить опрос, чтобы узнать, осталось ли сообщение? Если он исчезает, то подтверждается, что задача выполнена успешно? Оправдывает ли это дополнительное время ожидания ценность несвязанной системы? Поскольку было бы проще, если бы веб-сервер выполнял всю отправку электронной почты и т. Д.

2. Если сообщение исчезает, это подтверждает, что оно было успешно обработано. Что касается того, нужно ли веб-серверу проводить опрос, ну, это зависит от варианта использования. Зачем веб-серверу нужно это знать? Что он будет делать при обнаружении успеха или сбоя? Из того, что я понимаю из вашего описания, веб-серверу просто нужно отправить электронное письмо, так зачем ему беспокоиться о подтверждении? Как только вы поместите сообщение в очередь, вы можете быть уверены, что оно приведет к отправке электронного письма, если это возможно. Если это невозможно, сообщение в конечном итоге окажется в очереди мертвых писем для ручной обработки.

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

4. Если веб-сервер знает, что сообщение отправлено, он также может уведомить пользователя на той же странице, если это возможно. Я написал свою серверную часть на Java, но я решаю использовать Python для своего интерфейса. Кажется, проще использовать SQS для связи.

5. Если процесс, которому требуется отправить электронное письмо, хочет дождаться результата, он не должен использовать очередь сообщений. Он должен отправлять само электронное письмо или использовать для этого что-то вроде веб-службы. Очереди сообщений предназначены для случаев, когда вы хотите что-то сделать, но не хотите ждать его завершения.