AWS: несколько экземпляров, читающих SQS

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

Я могу удалить сообщение из очереди, когда оно будет обработано. Но если он еще не удален и все еще обрабатывается экземпляром, другой экземпляр МОЖЕТ загрузить это же сообщение и, на мой взгляд, его также обработать.


person Erik van de Ven    schedule 12.05.2015    source источник


Ответы (2)


Помимо довольно отдаленной возможности того, что 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
comment
Четкий ответ! Спасибо! Поэтому, когда я загружаю и обрабатываю одно сообщение за раз, проблем быть не должно :) Или я могу изменить тайм-аут видимости ... Полезно знать, спасибо - person Erik van de Ven; 12.05.2015
comment
Привет спасибо за ответ Требуется быстрое пояснение: когда в очередях FIFO указано «обработка в точности один раз», означает ли это, что потребители, читающие эти SQS, обрабатывают эти сообщения только один раз или сообщения публикуются в очереди только один раз. Например, если есть несколько процессов, читающих сообщения из очереди, каждое сообщение гарантированно будет прочитано процессом только один раз. - person Abhi; 05.03.2019
comment
@Abhi и то, и другое. Очереди SQS FIFO гарантируют, что сообщение будет доставлено только один раз, по порядку, а также предоставляют механизмы, гарантирующие, что данное сообщение будет поставлено в очередь только один раз в течение 5-минутного интервала, что помогает избежать таких обстоятельств, как разрывы сетевого соединения в точном порядке. неверный момент, когда сообщение об успешном завершении возвращается к производителю, в результате чего сообщение ставится в очередь, но производитель не уверен и отправляет повторно. В этом случае сообщение снова не ставится в очередь. - person Michael - sqlbot; 05.03.2019
comment
Спасибо, Майкл, но я понял, что не могу настроить очереди FIFO в качестве прослушивателя событий для корзины s3. - person Abhi; 06.03.2019

Вы можете получать повторяющиеся сообщения, но только "в редких случаях" . Итак, вы должны стремиться к идемпотентности.

person Rhythmic Fistman    schedule 12.05.2015