SQS + Shoryuken:尽管 auto_delete=true,但 FIFO 中的接收计数很大

SQS + Shoryuken: Large Receive Count in FIFO despite auto_delete=true

我有一个 AWS SQS FIFO 队列配置为根据内容删除重复消息。我的 rails 应用程序使用 Shoryuken worker 从 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

如您所见,它配置为在收到消息后自动从队列中删除消息。但是今天发生了一件奇怪的事情。我注意到工人执行大量相同的任务。当我在 AWS 控制台中打开 SQS 队列时,我看到其中有一条消息,看起来它已被工作人员多次接收。这是它的属性,注意接收计数:

Message ID: 9207017f-ad15-4de8-97c4-cf391c8f3840

Size: 1.3 KB

MD5 of Body: 55918bf431e31e4badae0720453aea35

Sent: 2018-12-11 10:40:53.978 GMT-08:00

First Received: 2018-12-11 10:40:54.045 GMT-08:00

Receive Count: 2654

Message Attribute Count: 0

Message Group ID: default Message

Deduplication ID: c5fb9acda5e3c9c82dc0ae3f0b1cff5bd7067d0cf942075c4c38dddd1fbc1ed1

Sequence Number: 37288893882837472512

知道这是怎么发生的吗?

平台详情:Ubuntu,ruby 2.5.3,Rails:5.2.2,升龙研:4.0.2

事实证明,问题出在队列的 VisibilityTimeout 设置上。默认情况下,它设置为 30 秒,但消息通常会在允许的 30 秒之外到达接收方,这意味着 Shoryuken 无法从队列中删除收到的消息,并出现以下错误:

ERROR: Could not delete 0, code: 'ReceiptHandleIsInvalid', message: 'The receipt handle has expired', 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