Помимо довольно отдаленной возможности того, что SQS неправильно доставит одно и то же сообщение более одного раза (что вам все равно нужно учитывать, даже если это маловероятно), я подозреваю, что ваш вопрос связан с незнанием концепции SQS «тайм-аут видимости». "
Сразу после того, как компонент получит сообщение, оно все еще находится в очереди. Однако вы не хотите, чтобы другие компоненты системы снова получали и обрабатывали сообщение. Поэтому Amazon SQS блокирует их с тайм-аутом видимости, который представляет собой период времени, в течение которого Amazon SQS не позволяет другим компонентам-потребителям получать и обрабатывать это сообщение.
http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/AboutVT.html
Это то, что не позволяет нескольким участникам очереди видеть одно и то же сообщение. По истечении времени ожидания видимости сообщение будет снова доставлено потребителю очереди, если вы его не удалите или оно не превысит максимальное настроенное количество доставок (в этот момент оно удаляется или переходит в отдельную очередь недоставленных сообщений, если вы ее настроили. ). Если задание займет больше времени, чем настроенный тайм-аут видимости, ваш потребитель также может отправить запрос в SQS, чтобы изменить тайм-аут видимости для этого отдельного сообщения.
Обновление:
Поскольку этот ответ был изначально написан, SQS представила очереди FIFO в некоторых регионах AWS. Они работают по той же логике, что описана выше, но с гарантированной доставкой по порядку и дополнительными мерами безопасности, чтобы гарантировать, что случайная доставка дублирующихся сообщений не может произойти.
Очереди FIFO (First-In-First-Out) предназначены для улучшения обмена сообщениями между приложениями, когда порядок операций и событий является критическим или когда дублирование недопустимо. Очереди FIFO также обеспечивают однократную обработку, но ограничены до 300 транзакций в секунду (TPS).
http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html
Переключение приложения в очередь FIFO требует некоторых изменений кода и требует создания новой очереди - существующие очереди не могут быть преобразованы в FIFO.
person
Michael - sqlbot
schedule
12.05.2015