我配置了一个AWS队列,用于根据内容去复制消息。我的rails应用程序使用矮人工人从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队列时,我看到其中有一条消息,它看起来是被工作人员多次接收的。下面是它的属性,注意接收计数:
消息ID: 9207017f-ad15-4de8-97c4-cf391c8f3840 大小: 1.3 KB 身体MD5 :55918bf431e31e4 badae0720453aea 35 发送时间: 2018-12-11 10:40:53.978格林尼治时间-08:00 首次收到: 2018-12-11 10:40:54.045格林尼治时间-08:00 接收计数: 2654 消息属性计数:0 消息组ID:默认消息 去重叠ID: c5fb9acda5e3c9c82dc0ae3f0b1cff5bd7067d0cf942075c4c38dddd1fbc1ed1 序列号: 37288893882837472512
知道怎么会发生这种事吗?
平台详细信息: Ubuntu,ruby 2.5.3,Rails: 5.2.2,Shoryuken: 4.0.2
发布于 2018-12-18 20:34:37
结果,问题在于队列的VisibilityTimeout设置。默认情况下,它被设置为30秒,但通常消息会在允许的30秒之外到达接收方,这意味着收到的消息将无法从队列中删除,出现以下错误:
错误:无法删除0,代码:“ReceiptHandleIsIn有效值”,消息:“收据句柄已过期”,sender_fault: true
解决方案是增加VisibilityTimeout。我把它设置为最长12小时,这解决了这个问题。
更多关于VisibilityTimeout:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html的信息
https://stackoverflow.com/questions/53750635
复制相似问题