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

问题描述 投票:0回答:2

目前,我有一个 AWS SQS 作为我的 AWS Lambda 函数的触发器。

我想实施长轮询以降低成本,因为我已经用掉了 70% 的每月免费套餐,其中大部分来自空接收。

我尝试通过将队列属性

ReceiveMessageWaitTimeSeconds
更改为
20 seconds
来设置长轮询:

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

当a的WaitTimeSeconds参数时,就会发生短轮询。 ReceiveMessage 请求通过以下两种方式之一设置为 0:

  • ReceiveMessage 调用将 WaitTimeSeconds 设置为 0。
  • ReceiveMessage 调用未设置 WaitTimeSeconds,但队列属性 ReceiveMessageWaitTimeSeconds 设置为 0。

注意

对于 ReceiveMessage 操作的 WaitTimeSeconds 参数, 设置在 1 到 20 之间的值优先于为 队列属性 ReceiveMessageWaitTimeSeconds。

由于AWS Lambda正在接收SQS请求,我认为无法配置

WaitTimeSeconds

为什么我的长轮询配置在这种情况下不起作用?是我理解错了,还是我配置错了?

谢谢!

amazon-web-services aws-lambda amazon-sqs long-polling
2个回答
18
投票

实际上长轮询适合您的情况。

5 lambdas * polling / 20 seconds * 3600 seconds in an hour = 900 receives/hour

我认为您错过的是“5 个最小并发 lambda”。 Lambda 扩展行为文档中隐含了这一点,但在公告/深入博客的“其他信息”部分中更明确地列出了这一点。

最初创建并启用 SQS 事件源映射时,或者 当消息在一段时间没有流量后首次出现时,则 Lambda 服务将开始轮询 SQS 队列使用五个并行 长轮询连接。 Lambda 服务监控的数量 飞行中的消息,以及当它检测到该数字呈趋势时 向上,它将增加轮询频率 20 ReceiveMessage 每分钟的请求数和每分钟 60 次调用的函数并发数 分钟。


0
投票

自 2023 年 1 月起,您可以在事件源映射上指定最大并发数,这可以减少这些长轮询费用。您可以将其设置为低至 2。这可能会降低您的成本,从每分钟 15 空接收(5 个 lambda,每次长轮询 20 秒,因此每次轮询每分钟 3 次)到 6(2 个 lamdbas,每个长轮询每分钟 3 次)。每 100 万个 SQS 请求 0.40 美元,我们这里讨论的不是巨额节省,但对于较小的项目,这可能会阻止您超过 100 万个免费套餐限制。希望这有帮助!

参考资料:

  • 在使用 Amazon SQS 作为事件源时引入 AWS Lambda 函数的最大并发性
  • 配置 Amazon SQS 事件源的最大并发数
  • Terraform lambda_event_source_mapping、scaling_config-configuration-block
© www.soinside.com 2019 - 2024. All rights reserved.