我有一个简单的lambda函数,递归遍历树结构。在树中的每个节点上,执行一些数据库调用(查看当前对象是否存在,可能创建和更新具有子节点知识的父节点记录。)和lambda调用自身(创建新的lambda执行)传递已连接的子节点列表。
我们正在遍历的树并不是很大,但它足够大,几乎可以立即触及我们的并发。
什么是限制lambda的解决方案,以避免并发问题。
一些想法:
使用队列系统:拥有执行工作的先进先出队列。 - 这里的痛苦是你失去了与父母的联系 - 以sqs为单位的消息大小非常有限。 - 必须观察执行时间,以确保它在耗尽时间之前死亡。
使用sns来人为地限制请求。 (这似乎不是正确的方法,但人们已经在网上提到过。)添加一个sns调用会增加更多的处理时间(成本更高),但仍会以较慢的速度调用相同数量的lambdas。 - 这里的痛苦是我们的信息有限。 (我们在每个节点遍历中传递所有子节点。) - 从长远来看,它会花费更多,抛出额外的处理只是为了减慢一些事情。
还有其他严格的无服务器解决方案,而不提高我们的并发能力?想法的想法?
一种解决方案是将重物(递归函数)从lambda移动到容器。
而不是生活在lambda中的递归函数,它将存储在AWS ECS中的容器中。然后,该容器将与AWS Batch作业相关联,该作业可按需排队。
当您的数据到达lambda时,它将不再开始被解析。相反,lambda将启动批处理作业并将数据传递给该作业。
容器中的代码将包含递归函数。这里有两个选择。
根据系统的目标,可能需要以不同方式使用已处理的数据。从批处理作业,它不能传递给原始lambda。但是,这可能不是必需的,或者诸如步骤函数之类的其他技术,可以使用表事件来促进数据的返回。