根据 SQS 文档,我们可以配置消息隐藏时间的最长时间为 15 分钟 - http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html
假如我需要将消息隐藏一整天,该怎么设置呢? 例如,我想模拟每天定时执行某些操作。
谢谢
根据 SQS 文档,我们可以配置消息隐藏时间的最长时间为 15 分钟 - http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html
假如我需要将消息隐藏一整天,该怎么设置呢? 例如,我想模拟每天定时执行某些操作。
谢谢
最简单的方法如下:
SQS.push_to_queue({perform_message_at : "Thursday November 2022"},delay: 15 mins)
您的 worker 内部
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
基本上将消息推回队列并设置最大延迟,仅在其处理时间小于当前时间时才对其进行处理。
希望对你有帮助。
Cloudwatch可能是更好的方法。您可以使用createEvent API和计时器,让它触发lambda函数或调用下一步的API。
另一种方法是在AWS步骤函数中使用"wait"实用程序。
https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-wait-state.html
无论如何,除非您非常确定永远不需要超过15分钟的任何东西,否则使用SQS后门添加延迟似乎有些危险。
可见性超时最多可以设置为12小时。我认为你可以编写一些代码,在处理消息时不要将其删除,下次处理该消息时已经过去了12小时。因此,使用一个消息和可见性超时为12小时的队列可以实现12小时的计划任务。
如果资源利用效率不是问题,那么对使用可见性超时队列进行微调可能会很有用。这可以让我们延迟最多12小时,但如果我们将消息切换到另一个队列,则可以延长时间。
Amazon SQS队列中的可见性超时功能为未从队列中删除的消息(如果消费者无法处理它)提供基于间隔的重试机制,默认设置为30秒。因此,相同的消息将在30秒间隔内不断出现在消费者面前,直到其从队列中删除为止。
SQS还提供了一种处理未从队列中删除的消息的方法,即使用死信队列,该队列将排队无法处理(或说未从主队列中删除)的消息。消息进入死信队列的重试次数是可配置的。
关键在于使用死信队列来处理而不是实际队列。
我们可以配置两个队列Q1和Q1-dead-queue。在默认可见超时设置为所需值的1次尝试后,Q1将具有Q1-dead-queue作为备份队列。
对于Q1的消费者只会消耗它(不进行处理),但不会从Q1中删除它。然后,此消息将等待配置的可见超时时间(最长可达12小时),并将被放入Q1-dead-queue中,死信队列的消费者现在可以及时处理它。
此外,可见超时时间也可以在消息级别上进行配置。
参考资料:
两个想法。
您可以通过在第一个队列上添加MaxReceives设置为1的DLQ来实现此操作。 在第一个队列上添加一个简单的Lambda函数,并通过Lambda函数使消息失败。因此,消息将自动移动到DLQ,然后您可以从DLQ中消费。 主队列和DLQ都可以具有最长15分钟的延迟,因此最终您将获得30分钟的延迟。
因此,您的消费者应用程序将在30分钟后接收到消息,而无需添加任何自定义逻辑。
使用 Step Functions 工作时面临的一些挑战是注册机器的规模(如果您的系统有此要求)。如果您使用 EventBridge 来触发它们,您会耗尽允许的规则集(截至本文发布时,限制为 200)。例如:如果您需要每月设置 150,000 个任意事件,则很快就会遇到限制。