AWS SQS将消息延迟X秒,然后将下一条消息再次延迟X秒

时间:2020-07-23 12:54:26

标签: amazon-web-services aws-lambda amazon-sqs amazon-sns

正在寻找一种方法,将发送到lambda的消息延迟5秒。

因此,lambda接收到消息1,然后在消息2之后5秒钟,然后是消息3之后5秒钟,依此类推,例如说一千条消息。

正在查看SQS延迟队列和消息计时器,但它们并不是我想要的。

使用等待功能来逐步运行,但是按照我需要的规模,这会很昂贵。

理想情况下,需要一个SQS队列来将消息限制为仅每5秒发送一次,有什么办法吗?

p.s。不必为SQS感到困惑,只需要一个解决方案

2 个答案:

答案 0 :(得分:0)

您可以使用FIFO Queues。它支持消息排序和按队列延迟。了解以下警告很重要

  • 严格保留消息的发送和接收顺序,并且消息只发送一次,并一直可用,直到使用者处理并删除它为止。
  • FIFO队列支持消息组,该消息组允许在单个队列中包含多个有序消息组。
  • FIFO队列不支持每个消息延迟,仅支持每个队列延迟。如果您的应用程序在每条消息上都设置了DelaySeconds参数的相同值,则必须修改您的应用程序以删除每个消息的延迟,并在整个队列上设置DelaySeconds。
  • 每个API方法(SendMessage,ReceiveMessage或DeleteMessage),
  • FIFO队列支持300 TPS。您可以使用批处理API提取3000的TPS。

现在,如果消息之间的延迟是恒定的,并且您不需要以大于3000 TPS的速率填充/耗尽队列,那么FIFO队列就可以工作。

答案 1 :(得分:0)

您可以使用get_queue_attributes()并检索“ roximateNumberOfMessagesDelayed”。这实际上将告诉您队列中当前有多少条消息,您可以使用此消息将其与所需的延迟时间相乘。为此,您必须分别延迟每个消息,而不是整个队列。 (即DelayTime *近似NumberOfMessagesDelayed + DelayTime)