【问题标题】:Limit AWS SQS messages visible per second of AWS Lambda invocations per second限制每秒 AWS Lambda 调用每秒可见的 AWS SQS 消息
【发布时间】:2020-06-08 13:21:42
【问题描述】:

我正在实施一个涉及触发 Lambda 函数的 SQS 的解决方案,该解决方案使用第 3 方 API 来执行一些操作。 该第 3 方 API 每秒请求数有限制,因此我想将我的 Lambda 函数处理的 SQS 消息数量限制在类似的速率。

有没有办法限制 SQS 上每秒可见的消息数或 Lambda 函数每秒的调用数?

[编辑]

在 cmets 中给出了一些关于 AWS Kinesis 的见解之后: 通过处理 Kinesis 参数 Batch Window、Batch 大小和有效负载大小没有精益解决方案,因为 Kinesis 的行为会在任何阈值并达到时触发 lambda 执行: * 给定 N = 每秒我可以通过 3rd 方 api 执行的最大请求数。 * 配置 Batch Window = 1 秒和 Batch Size 为 N,back presurre 应该触发超过 N_MAX 个请求的执行。 * 配置 Batch Windows = 1 secnd 和 Batch Size 为 MAX_ALLOWED_VALUE,将性能不佳,也不能保证每秒执行少于 N 次。

我发现的最简单的解决方案是创建一个固定执行速率为 1 秒的 Lambda,它从 SQS/Kinesis 读取固定数量的消息 N,并将这些消息写入另一个 SQS/Kinesis,将另一个 Lambda 作为端点.

【问题讨论】:

  • 可以使用reserved concurrency来限制lambda函数的最大并发
  • 如果它不必是sqs,另一种方法是kinesisbatch window 选项。

标签: aws-lambda amazon-sqs quota


【解决方案1】:

这是一个困难的情况。

Amazon SQS 可以并行触发多个 AWS Lambda 函数,因此无需集中监督向 3rd 方 API 发出请求的速度。

来自Managing concurrency for a Lambda function - AWS Lambda

为保证函数总能达到一定的并发度,可以为函数配置保留并发。当一个函数保留并发时,没有其他函数可以使用该并发。 预留并发还限制了函数的最大并发,并应用于整个函数,包括版本和别名。

因此,并发可以用来限制同时 Lambda 函数执行的数量,但这并不一定映射到“每秒 x API 调用”。这将取决于 Lambda 函数执行所需的时间(例如 2 秒)以及在这段时间内它进行了多少 API 调用(例如 2 次 API 调用)。

可能需要在 Lambda 函数内引入延迟(不是很好,因为您仍在为函数在等待时运行付费)或 Lambda 外函数(通过以不同方式触发 Lambda 函数,甚至在 Lambda 之外进行处理)。

最简单(但效率不高)的方法可能是:

  • 设置 并发 1
  • 如果被拒绝,让 Lambda 函数重试 API 调用

【讨论】:

  • 我也遇到了同样的情况,将并发设置为 1 对我有用。我的方法是在 API 饱和时以统一随机可见性超时放回消息,以便平衡其负载。
【解决方案2】:

感谢@John Rotenstein 对 SQS 部分给出了全面而详细的回答。

如果您的设计仅限于单个消费者,则可以将 sqs 替换为 kinesis 流。通过替换它,您可以使用 kinesis 的batch window 选项来限制消费者发出的请求。批处理窗口选项用于reduce the number of invocations

Lambda 以固定的节奏(例如,Kinesis 数据流每秒一次)从流中读取记录,并使用一批记录调用函数。批处理窗口允许您在调用函数之前等待 300 秒来构建批处理。现在,当满足以下条件之一时调用函数:有效负载大小达到 6MB,Batch Window 达到最大值,或 Batch Size 达到最大值。使用批处理窗口,您可以增加每次调用传递给函数的平均记录数。当您想减少调用次数并优化成本时,这很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 2019-06-12
    • 2017-09-20
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多