AWS SQS长轮询不能减少空接收

17

目前,我使用AWS SQS作为触发器来调用我的AWS Lambda函数。

我想实现长轮询以减少成本,因为我已经使用了月度免费套餐的70%,其中大部分是由于空接收。

我尝试通过更改队列属性ReceiveMessageWaitTimeSeconds20秒来设置长轮询:

SQS Details showing ReceiveMessageWaitTimeSeconds set to 20s

然而,这似乎并没有减少空接收的数量,在11/19 2:00-3:00之间更改设置。Empty Receives graph shows the same trend even after setting long polling 根据AWS文档WaitTimeSeconds优先于队列属性ReceiveMessageWaitTimeSeconds 引用:
短轮询发生在以下两种情况下,当ReceiveMessage请求的WaitTimeSeconds参数设置为0时:
1. ReceiveMessage调用将WaitTimeSeconds设置为0。
2. ReceiveMessage调用没有设置WaitTimeSeconds,但队列属性ReceiveMessageWaitTimeSeconds设置为0。
请注意:
对于ReceiveMessage操作的WaitTimeSeconds参数,设置在1到20之间的值优先于为队列属性ReceiveMessageWaitTimeSeconds设置的任何值。
由于AWS Lambda正在接收SQS请求,我认为无法配置WaitTimeSeconds
为什么我的长轮询配置在这种情况下不起作用?我是否理解有误或者配置错误?
谢谢!

1
你为什么要使用Amazon SQS来触发Lambda函数?你可以通过向Amazon SNS发送消息来触发Lambda函数,它不需要轮询,但也可以实现Lambda函数触发。你的应用程序是否有特定的需求需要使用SQS呢? - John Rotenstein
我们更喜欢使用SQS来设置信件保留期(最长14天)和死信队列的简单设置。 - naribo
1个回答

18

实际上,长轮询在您的情况下是有效的。

5个Lambda * 每20秒轮询一次 * 每小时3600秒 = 每小时900次接收

我认为你忽略了"至少需要5个并发Lambda函数"这一点。这在Lambda Scaling Behaviour文档中是隐含的,但更有用且明确地在公告/深入介绍博客的"Additional Information"部分中进行了详细阐述。

当SQS事件源映射最初被创建并启用,或者在无任何流量的一段时间后消息首次出现时, Lambda服务将使用五个并行的长轮询连接来轮询SQS队列。Lambda服务监视正在进行中的消息数量, 当它检测到此数量趋势上升时,它将按每分钟20个ReceiveMessage请求和每分钟60个函数并发调用增加轮询频率。


谢谢@thomasmichaelwallace!这解释得很清楚了。 那么,为了澄清,默认情况下Lambda进行长轮询,这就解释了为什么更改我的队列属性“ReceiveMessageWaitTimeSeconds”没有改变空接收的数量? - naribo
1
是的- Lambda长轮询(每20次)直到有消息,然后它会移动到越来越短的轮询,直到队列为空。(它不尊重队列的“RecieveMessageWaitTimeSecond”)。 - thomasmichaelwallace
1
这很棒,但我们有没有解决方案来降低这个成本呢? - Kristijan Iliev
5
很遗憾,最少需要15个长轮询(每分钟3次;5个并行)才能进行。如果你保留并发性,你仍然可以完成轮询,但是 Lambda 函数会被限制速率(最终会增加成本)。如果你的数据传输速度足够慢,以至于 SQS 的成本成为问题,那么你可能可以安全地使用 SNS 替代,因为它没有这种固定的“运行”成本。 - thomasmichaelwallace
只是补充一下@thomasmichaelwallace的答案 - 你可以使用SNS代替SQS,但是有一些限制,详细信息在这里很好地描述了: https://aws.plainenglish.io/aws-sns-to-lambda-vs-sns-to-sqs-to-lambda-788d4cc96f34 - Nigrimmist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接