如何限制无服务器lambda函数的并行执行

How to limit parallel execution of serverless lambda function

我正在使用 AWS 并使用无服务器框架。我的无服务器 lambda 函数由事件触发。然后我与数据库交谈,我可以用数据库打开的连接数有限制。

所以我只想一次 运行 5 个 lambda 函数并对其他事件进行排队。我知道有:

    provisionedConcurrency: 3 # optional, Count of provisioned lambda instances
    reservedConcurrency: 5 # optional, reserved concurrency limit for this function. By default, AWS uses account concurrency limit

所以在这种情况下,指定数量的长 运行ning 作业将在那里,它们将为事件提供服务。

但我想要的不是事件排队,而是将触发函数,这样一次最多 运行ning 5 个函数。

我想知道 AWS 是否支持这种事件排队的概念?

在 AWS Lambda 中,并发限制决定了一个区域中可以同时 运行 调用多少个函数。您可以通过 AWS Lambda 控制台或无服务器框架设置此限制。

如果您的帐户限制为 1000,并且您为特定函数保留了 100 个并发执行,为另一个函数保留了 100 个并发执行,则该区域中的其余函数将共享剩余的 800 个执行。

如果您为特定函数保留并发执行,AWS Lambda 假定您知道要保留多少以避免性能问题。分配并发的函数不能访问未预留的并发。

在Serverless Framework 中设置预留并发限制的正确方法是您分享的方法:

functions:
  hello:
    handler: handler.hello # required, handler set in AWS Lambda
    reservedConcurrency: 5 # optional, reserved concurrency limit for this function. By default, AWS uses account concurrency limit

我建议使用 SQS 来管理您的队列。使用队列的常见架构原因之一是限制架构不同部分的压力。这可能意味着在处理大量消息时防止数据库过载或避免第三方 API 的速率限制。

例如,让我们考虑一下您的 SQS 处理逻辑需要连接到数据库的情况。你想限制你的工作人员一次不超过 5 个打开的数据库连接,通过并发控制,你可以设置适当的限制来保持你的架构。

在您的情况下,您可以有一个函数 hello,它接收您的请求并将它们放入 SQS 队列中。另一方面,函数 compute 将获取这些 SQS 消息并计算它们,将并发调用的数量限制为 5。

您甚至可以设置批量大小,即单个 lambda 中可以包含的 SQS 消息数。

functions:
  hello:
    handler: handler.hello

  compute:
    handler: handler.compute
    reservedConcurrency: 5
    events:
      - sqs:
          arn: arn:aws:sqs:region:XXXXXX:myQueue
          batchSize: 10 # how many SQS messages can be included in a single Lambda invocation
          maximumBatchingWindow: 60 # maximum amount of time in seconds to gather records before invoking the function

您是否考虑过代理端点(充当池)而不是限制 lambda 的并发。另外,我认为 lambda <-> SQS 通信的发生方式是通过某个事件池,将并发设置为低于它们运行的​​线程数量将导致您不得不处理丢失的消息。

https://aws.amazon.com/rds/proxy/