【问题标题】:AWS Lambda Triggered by SQS increases SQS request count由 SQS 触发的 AWS Lambda 增加了 SQS 请求计数
【发布时间】:2019-03-25 01:41:27
【问题描述】:

我有一个由 SQS 触发的 AWS Lambda 函数。此函数每天触发大约 100 次,但 SQS 队列的请求计数每天大约为 20.000 次。我不明白为什么向 SQS 发出的请求数量太高。我的期望是向 SQS 发出的请求数应该与 Lambda 调用相同。

我的账户中只有一个 Lambda 函数和一个 SQS 队列。

可以和SQS队列的轮询有关吗?我试图从队列配置中更改 SQS 的轮询间隔,但没有任何改变。另一种可能性是从 Lambda 函数配置中更改轮询间隔。但是,我找不到任何相关参数。

简而言之,我想减少 SQS 请求的数量,如何在使用 SQS 调用 Lmabda 函数时做到这一点?

【问题讨论】:

  • “改变SQS的轮询间隔”是什么意思?另外,您在哪里看到列出的 20,000 个请求?
  • 轮询间隔实际上是“接收消息等待时间”。可以在计费页面上看到请求。具体在标题下:“所有免费层级服务(按使用情况)”。

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


【解决方案1】:

当使用 SQS 作为 AWS Lambda 的事件源时,AWS Lambda 会定期轮询配置的 SQS 队列以获取新消息。虽然官方文档对此并不清楚,但blog post announcing that feature 详细说明了这一点:

当最初创建并启用 SQS 事件源映射时,或者当消息在一段时间没有流量后首次出现时,Lambda 服务将开始使用五个并行长轮询连接轮询 SQS 队列。

根据AWS documentation,从 AWS Lambda 到 SQS 的长轮询的默认持续时间是 20 秒。

这导致 AWS Lambda 函数每 20 秒向 SQS 发出 5 次请求,而负载不高,总计每天约 21600 次,接近您遇到的 20000 次。

虽然增加长轮询持续时间似乎是减少请求数量的一种简单方法,但这是不可能的,因为默认情况下 AWS Lambda 使用的 20 秒已经是 maximum possible duration for an SQS queue。当将 SQS 用作 AWS Lambda 的事件源时,恐怕没有简单的方法可以减少对 SQS 的请求。相反,如果其他事件源(如 SNS)也适合您的用例,则可能值得评估。

【讨论】:

  • 感谢您的澄清。 SNS 不适合我的用例,因为我需要两个连续的 Lambda 调用之间的延迟,而 SQS 具有消息延迟功能。也许在功能 AWS 将提供更多设置来配置并行连接和轮询持续时间。
  • 感谢分享文档。这在设计上非常糟糕。当消息到达基础设施时,它应该知道收到了消息,应该从那里实现触发器。这是 AWS 的一条捷径和快速实施方案。很高兴我们正在维护 SNS 路径。
【解决方案2】:

这是我们最初在没有 SQS 触发器时的实现方式。

使用 SQS Cloudwatch 指标创建 SNS 触发器

ApproximateNumberOfMessagesVisible > 0

从 SNS 触发 Lambda,从 SQS 读取消息并将其传递给任何需要消息的 lambda。

或者,您可以使用 Kinesis 将其交付给 Lambda。

SQS --> Cloudwatch(触发 Lambda)--> Lambda(读取消息)--> Kinesis(设置批量大小)--> Lambda(处理实际消息)

您也可以直接使用 Kinesis,但不会延迟交付。

希望对你有帮助。

【讨论】:

  • 我会尝试您的建议,即使用 SQS Cloudwatch 指标触发 SNS。我没有意识到这一点。谢谢。
猜你喜欢
  • 2020-05-17
  • 1970-01-01
  • 2020-07-28
  • 2020-10-15
  • 2020-02-15
  • 2021-03-28
  • 2018-03-01
  • 1970-01-01
相关资源
最近更新 更多