SQS + Shoryuken: большое количество полученных в FIFO, несмотря на auto_delete = true - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть очередь 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

Идентификатор группы сообщений: сообщение по умолчанию

Идентификатор дедупликации: c5fb9acda5e3c9c82dc0ae3f0b1cff5bd70dd1fcb94_d1cc94*

Порядковый номер: 37288893882837472512

Есть идеи, как это могло произойти?

Детали платформы: Ubuntu, ruby ​​2.5.3, Rails: 5.2.2, Shoryuken: 4.0.2

1 Ответ

0 голосов
/ 18 декабря 2018

Оказывается, проблема была в настройке 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

...