【问题标题】:AWS SQS Long Polling doesn't reduce empty receivesAWS SQS 长轮询不会减少空接收
【发布时间】:2023-03-30 01:17:01
【问题描述】:

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

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

我尝试通过将队列属性 ReceiveMessageWaitTimeSeconds 更改为 20 seconds 来设置长轮询:

但是,这似乎并没有减少空接收的数量,在 11 月 19 日的 2:00 - 3:00 之间更改了设置。

根据AWS DocumentationWaitTimeSeconds 优先于队列属性ReceiveMessageWaitTimeSeconds

短轮询发生在一个 WaitTimeSeconds 参数 ReceiveMessage 请求通过以下两种方式之一设置为 0:

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

注意

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

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

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

谢谢!

【问题讨论】:

  • 为什么要使用 Amazon SQS 来触发 Lambda 函数?您可以改为向 Amazon SNS 发送消息,这也可以触发 Lambda 函数,但不需要轮询。您的应用程序是否特别需要使用 SQS?
  • 我们更喜欢在信函保留期(最长 14 天)和死信队列的简单设置中使用 SQS

标签: amazon-web-services aws-lambda amazon-sqs long-polling


【解决方案1】:

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

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

我认为您错过的是“最少 5 个并发 lambda”。这在Lambda Scaling Behaviour 文档中有所暗示,但在announcement/deep-dive blog 的“附加信息”部分中更有用且更明确地列出。

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

【讨论】:

  • 谢谢@thomasmichaelwallace!这解释了它。所以澄清一下,默认情况下 Lambda 长轮询,这就解释了为什么更改我的队列属性 ReceiveMessageWaitTimeSeconds 并没有改变空接收的数量?
  • 是 - Lambda 长轮询(每 20 次)直到有消息,然后它移动到越来越短的轮询直到队列为空。 (它不尊重队列的RecieveMessageWaitTimeSecond)。
  • 这很好,但是我们有解决方案如何降低此成本吗?
  • 很遗憾,15 次(每分钟 3 次;并行 5 次)是最少的。如果您保留并发性,您仍然会进行民意调查,您只会在 lambda 上受到限制(最终花费更多)。如果您的数据移动速度太慢以至于 SQS 的成本是一个问题,您可以安全地使用 SNS,而不是没有这种固定的“运行”成本。
猜你喜欢
  • 2021-01-17
  • 2021-06-07
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
相关资源
最近更新 更多