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

Другие вопросы по тегам