SQS - 交货延迟 30 分钟

SQS - Delivery Delay of 30 minutes

根据 SQS 的文档,我们可以为消息隐藏其消费者的最大时间延迟配置为 15 分钟 - http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html

假设我需要隐藏消息一天,模式是什么? 例如。我想模仿每天的 cron 来做一些动作。

谢谢

两个想法。

  1. 未经测试。也许发布到没有 SQS 队列的 SNS 主题。当需要进行交付时,将队列订阅到该主题。 (我没有这样做,我不确定这是否会按预期工作)
  2. 将消息作为文件推送到中央存储(如 S3)。创建一个查看时间创建时间戳的工作人员,并决定是否将它们发布到队列中。如果创建时间 >= 1 天前,则发布。

可见超时最长可达 12 小时。我认为你可以一起破解一些东西,在那里你处理一条消息但不要删除它,下次处理它已经 12 小时了。因此,一个队列只有一条消息,可见性超时为 12 小时。这让你有一个 12 小时的 cron。

最简单的方法如下:

SQS.push_to_queue({perform_message_at : "Thursday November 2022"},delay: 15 mins)

在你的工人里面

message = SQS.poll_messages
if message.perform_message_at > Time.now
   SQS.push_to_queue({perform_message_at : "Thursday November 
   2022"},delay:15 mins)
else
   process_message(message)
end

基本上是把消息推回最大延迟的队列,只有当它的处理时间小于当前时间时才处理它。

HTH.

Cloudwatch 可能是更好的方法。您可以将 createEvent API 与计时器一起使用,并让它触发 lambda 函数或对接下来发生的任何事情的 API 调用。

另一种方法是在 AWS 步骤函数中使用 "wait" 实用程序。

https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-wait-state.html

无论如何,除非您非常确定您永远不需要超过 15 分钟的时间,否则添加延迟的 SQS 后门似乎很老套。

您可以通过在第一个队列中添加一个 MaxReceives 设置为 1 的 DLQ 来实现。 在第一个队列上添加一个简单的 Lambda 并使消息 vi Lambda 失败。所以消息会自动移动到 DLQ,然后你可以从 DLQ 消费。 主队列和 DLQ 都可以有最多 15 分钟的延迟,所以最后你得到 30 分钟的延迟。

因此您的消费者应用程序会在 30 分钟后收到消息,而无需在其上添加任何自定义逻辑。