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
我有一个 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