我有一个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
答案 0 :(得分:0)
结果是,问题出在队列的VisibilityTimeout
设置上。默认情况下,它设置为30秒,但是消息通常会在允许的30秒之外到达接收方,这意味着Shoryuken将无法从队列中删除收到的消息,并出现以下错误:
错误:无法删除0,代码:“ ReceiptHandleIsInvalid”,消息: “收据句柄已过期”,sender_fault:true
解决方案是增加VisibilityTimeout
。我将其设置为允许的最长12小时,这解决了该问题。
有关VisibilityTimeout的更多信息: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html