SQS-交付延迟30分钟

Aru*_*han 8 amazon-sqs amazon-web-services

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

假设我需要隐藏一天的邮件,模式是什么?例如。我想模仿做某事的每日cron。

谢谢

use*_*066 12

最简单的方法如下:

SQS.push_to_queue({perform_message_at : "Thursday November 2022"},delay: 15 mins)
Run Code Online (Sandbox Code Playgroud)

在你的工人里面

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
Run Code Online (Sandbox Code Playgroud)

基本上将消息以最大延迟推回到队列中,并且仅在其处理时间小于当前时间时才对其进行处理。

HTH。

  • 我原来的评论已被删除,但我提出的观点仍然很重要。如果您将消息延迟一天,则在最终使用此解决方案对其进行处理之前,您可能会对同一条消息进行排队和重新排队大约 100 次。这无法很好地扩展,而且 AWS 成本可能非常昂贵。 (7认同)
  • 嘿@user2076066,抱歉我应该澄清一下。我遇到了与您和 OP 相同的问题,并且正在构建 API 来解决这个问题。由于堵塞,所提出的解决方案的主要问题是消费者应该只承担 1 个责任 - 处理消息。这里有两个,既重新排队延迟消息,又处理消息。随着时间的推移,如果延迟很长,它会花费更多的时间重新排队延迟的消息,而不是完成其主要工作:处理消息。顺便说一句,我很想找个时间聊天,只是为了了解更多有关您的用例的信息。 (2认同)

小智 7

可见性超时最长可达 12 小时。我认为你可以在处理消息的地方一起破解一些东西,但不要删除它,下次处理它的时间是 12 小时。因此,一个包含一条消息且可见性超时为 12 小时的队列。这会给你一个 12 小时的 cron。

  • 这不成比例。有 120,000 条消息的限制,这些消息在任何给定时间都可以不可见(也就是在传输中)。 (23认同)

小智 7

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

另一种方法是在 AWS 步骤函数中使用“等待”实用程序。

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

在任何情况下,除非您非常确定您永远不需要超过 15 分钟的时间,否则添加延迟的 SQS 后门似乎很棘手。