SQS + Shoryuken: большое количество полученных в FIFO, несмотря на auto_delete=true
У меня есть очередь AWS SQS FIFO, настроенная для дедупликации сообщений на основе содержимого. Мое приложение rails использует рабочий Shoryuken для получения сообщений от SQS. Вот рабочий код:
class MyJob
include Shoryuken::Worker
shoryuken_options queue: "myjobs-#{ENV['RAILS_ENV']}.fifo",
auto_delete: true,
body_parser: JSON
def perform(message_meta, message_body)
# do stuff
end
end
Как видите, он настроен на автоматическое удаление сообщений из очереди после их получения. Но сегодня произошло нечто странное. Я заметил, что работник выполняет большое количество одинаковых задач. Когда я открыл Очередь SQS в Консоли AWS, я увидел, что в ней было сообщение, которое выглядело как полученное несколько раз рабочим. Вот его атрибуты, обратите внимание на счетчик получения:
ID сообщения: 9207017f-ad15-4de8-97c4-cf391c8f3840
Размер: 1,3 КБ
MD5 тела: 55918bf431e31e4badae0720453aea35
Отправлено: 2018-12-11 10:40:53.978 GMT-08:00
Первое поступление: 2018-12-11 10:40:54.045 GMT-08:00
Счетчик приёма: 2654
Количество атрибутов сообщения: 0
ID группы сообщений: сообщение по умолчанию
ID дедупликации: c5fb9acda5e3c9c82dc0ae3f0b1cff5bd7067d0cf942075c4c38dddd1fbc1ed1
Порядковый номер: 37288893882837472512
Есть идеи, как это могло произойти?
Детали платформы: Ubuntu, ruby 2.5.3, Rails: 5.2.2, Shoryuken: 4.0.2
1 ответ
Оказывается, проблема была в очереди VisibilityTimeout
установка. По умолчанию оно установлено равным 30 секундам, но часто сообщения поступают на сторону получателя вне допустимых 30 секунд, и это будет означать, что Shoryuken не удастся удалить полученное сообщение из очереди со следующей ошибкой:
ОШИБКА: не удалось удалить 0, код: "ReceiptHandleIsInvalid", сообщение: "Дескриптор получения истек", sender_fault: true
Решение состоит в том, чтобы увеличить VisibilityTimeout
, Я установил максимально допустимое значение 12 часов, и это решило проблему.
Подробнее о VisibilityTimeout: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html
Тема, которая поставила меня на правильный путь: https://github.com/aws/aws-sdk-java/issues/705