AWS Lambda Concurrency人工限制?

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

我有一个简单的lambda函数,递归遍历树结构。在树中的每个节点上,执行一些数据库调用(查看当前对象是否存在,可能创建和更新具有子节点知识的父节点记录。)和lambda调用自身(创建新的lambda执行)传递已连接的子节点列表。

我们正在遍历的树并不是很大,但它足够大,几乎可以立即触及我们的并发。

什么是限制lambda的解决方案,以避免并发问题。

一些想法:

使用队列系统:拥有执行工作的先进先出队列。 - 这里的痛苦是你失去了与父母的联系 - 以sqs为单位的消息大小非常有限。 - 必须观察执行时间,以确保它在耗尽时间之前死亡。

使用sns来人为地限制请求。 (这似乎不是正确的方法,但人们已经在网上提到过。)添加一个sns调用会增加更多的处理时间(成本更高),但仍会以较慢的速度调用相同数量的lambdas。 - 这里的痛苦是我们的信息有限。 (我们在每个节点遍历中传递所有子节点。) - 从长远来看,它会花费更多,抛出额外的处理只是为了减慢一些事情。

还有其他严格的无服务器解决方案,而不提高我们的并发能力?想法的想法?

amazon-web-services serverless
1个回答
0
投票

一种解决方案是将重物(递归函数)从lambda移动到容器。

建立

Batch Setup

而不是生活在lambda中的递归函数,它将存储在AWS ECS中的容器中。然后,该容器将与AWS Batch作业相关联,该作业可按需排队。

Lambda

当您的数据到达lambda时,它将不再开始被解析。相反,lambda将启动批处理作业并将数据传递给该作业。

Container

容器中的代码将包含递归函数。这里有两个选择。

  1. 批处理作业没有超时限制,因此您可以在作业中执行所有递归处理。
  2. 对于每个递归步骤,容器可以启动新的批处理作业并传递该数据分支(如果需要并行处理/缩短处理时间)

返回数据

根据系统的目标,可能需要以不同方式使用已处理的数据。从批处理作业,它不能传递给原始lambda。但是,这可能不是必需的,或者诸如步骤函数之类的其他技术,可以使用表事件来促进数据的返回。

© www.soinside.com 2019 - 2024. All rights reserved.