2013-09-09 1 views
3

Я использую очередь Амазонки SQS для отправки уведомлений во внешнюю систему.Как гарантировать, что Amazon SQS получит сообщение только один раз?

Если запрос HTTP не работает при использовании SQS 'SendMessage, я не знаю, было ли сообщение поставлено в очередь или нет. Моя политика по умолчанию - повторить отправку сообщения в очередь, но есть риск опубликовать сообщение дважды, что может быть неприемлемым в зависимости от варианта использования.

Есть ли способ, чтобы SQS отклонил сообщение, если в теле сообщения есть дубликат (или какие-то метаданные какого-либо сообщения, такие как уникальный идентификатор, который мы могли бы предоставить), чтобы мы могли повторить попытку до тех пор, пока сообщение не будет принято , и быть уверенным, что дубликат не будет, если первый запрос уже поставлен в очередь, но ответ был утерян?

ответ

4

Нет, такого механизма в SQS нет. Далее, также возможно, что сообщение будет доставлено два или более (семантика по крайней мере один раз). Поэтому, даже если такой механизм существует, вы не сможете гарантировать, что сообщение не будет доставлено несколько раз.

См: http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/DistributedQueues.html

Для точно однократной доставки, вам потребуется некоторая форма сделок (и HTTP не транзакционный протокол) как на передающем и приемном конце.

+0

Вот еще [предложил чтение о том, почему полное дедупликации не представляется возможным] (http://stackoverflow.com/a/38290017/836214) – Krease

1

AFAIK, прямо сейчас SQS поддерживает то, что было задано!

Пожалуйста, смотрите «Что нового» пост под названием Amazon SQS Introduces FIFO Queues with Exactly-Once Processing and Lower Prices for Standard Queues

По SQS FAQ:

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

Там также AWS Blog post с немного более глубоким представлением на тему:

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

......

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

Иногда повторяющиеся сообщения могут возникать, когда сетевая проблема за пределами SQS предотвращает получение сообщения отправителем сообщения о статусе действия и заставляет отправителя повторить вызов. Очереди FIFO используют несколько стратегий для обнаружения и устранения повторяющихся сообщений. В дополнение к дедупликации на основе контента вы можете включить MessageDeduplicationId при вызове SendMessage для очереди FIFO. Идентификатор может содержать до 128 символов и, если присутствует, имеет более высокий приоритет, чем дедупликация на основе контента.

+0

@ochi нормально, будет делать это завтра, когда к моему компьютеру – gvasquez

+1

Это сообщение не похоже на попытку ответить на этот вопрос. Ожидается, что каждый пост будет явной попыткой * ответить * на этот вопрос; если у вас есть критика или требуется разъяснение вопроса или другого ответа, вы можете [отправить комментарий] (// stackoverflow.com/help/privileges/comment) (например, этот) непосредственно под ним. Удалите этот ответ и создайте комментарий или новый вопрос. См.: [Задавайте вопросы, получайте ответы, не отвлекайтесь] (// stackoverflow.com/tour) – Mogsdad

+0

@Mogsdad Я только что отредактировал ответ, чтобы полностью содержать определенную часть ранее предоставленной ссылки, а также другие отрывки и ссылки для улучшения ответа. Это приемлемо сейчас? – gvasquez

 Смежные вопросы

  • Нет связанных вопросов^_^