SQS + Shoryuken:尽管auto_delete = true

时间:2018-12-12 20:10:19

标签: ruby-on-rails amazon-sqs shoryuken

我有一个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 Console中打开SQS Queue时,我看到其中有一条消息,看起来它是工作人员多次收到的。这里是它的属性,请注意接收计数:

  

消息ID:9207017f-ad15-4de8-97c4-cf391c8f3840

     

大小:1.3 KB

     

身体的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 个答案:

答案 0 :(得分:0)

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

  

错误:无法删除0,代码:“ ReceiptHandleIsInvalid”,消息:   “收据句柄已过期”,se​​nder_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

相关问题