SQS - 交货延迟 30 分钟
SQS - Delivery Delay of 30 minutes
根据 SQS 的文档,我们可以为消息隐藏其消费者的最大时间延迟配置为 15 分钟 - http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html
假设我需要隐藏消息一天,模式是什么?
例如。我想模仿每天的 cron 来做一些动作。
谢谢
两个想法。
- 未经测试。也许发布到没有 SQS 队列的 SNS 主题。当需要进行交付时,将队列订阅到该主题。 (我没有这样做,我不确定这是否会按预期工作)
- 将消息作为文件推送到中央存储(如 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 分钟后收到消息,而无需在其上添加任何自定义逻辑。
根据 SQS 的文档,我们可以为消息隐藏其消费者的最大时间延迟配置为 15 分钟 - http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html
假设我需要隐藏消息一天,模式是什么? 例如。我想模仿每天的 cron 来做一些动作。
谢谢
两个想法。
- 未经测试。也许发布到没有 SQS 队列的 SNS 主题。当需要进行交付时,将队列订阅到该主题。 (我没有这样做,我不确定这是否会按预期工作)
- 将消息作为文件推送到中央存储(如 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 分钟后收到消息,而无需在其上添加任何自定义逻辑。