我在 s3 存储桶中有 200 个 jsonl (json-lines) 文件。每个文件包含 100,000 个 JSON,将写入 DynamoDB。
我想使用 Lambda 从 S3 下载文件,并将其批量写入 DynamoDB(文件已经与表模式完全匹配)。
我有 200 个文件,但我无法同时调用 200 个 lambda 表达式——因为 DynamoDB 每秒只能写入 10,000 个 WCU,所以我每秒只能写入 10,000 行。而且 Lambda 表达式只能持续 300 秒,之后就会超时。
做到这一点的最好方法是什么?
我目前的想法是一次异步调用 5 个 Lambda,并监视日志文件以查看完成了多少个,只有完成一个后才调用下一个?
或者...
我可以设置并发执行限制将 lambda 函数设置为 5,然后异步调用该函数 200 次(每个文件一次)?当一个 lambda 完成时,AWS 会自动触发下一个 lambda 吗?
答案1
来自亚马逊文档:
https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html
通过对函数设置并发限制,Lambda 可保证将分配专门应用于该函数,而不管剩余函数处理的流量量是多少。如果超出该限制,该函数将受到限制。该函数在受到限制时的行为将取决于事件源。有关更多信息,请参阅限制行为
然后从处理节流行为的 AWS 文档中: https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html#throttling-behavior
一旦达到与函数关联的并发限制,对该函数的任何进一步调用请求都会受到限制,即调用不会执行您的函数。每次受限制的调用都会增加该函数的 Amazon CloudWatch Throttles 指标。AWS Lambda 以不同的方式处理受限制的调用请求,具体取决于它们的来源:
同步调用:如果函数以同步方式调用且受到限制,Lambda 将返回 429 错误,调用服务将负责重试。ThrottledReason 错误代码说明您遇到的是函数级别限制(如果指定)还是账户级别限制(请参阅下面的注释)。每项服务可能都有自己的重试策略。例如,CloudWatch Logs 最多会重试失败的批处理五次,每次重试之间会有延迟。有关事件源及其调用类型的列表,请参阅支持的事件源。
异步调用:如果您的 Lambda 函数是异步调用的并且受到限制,AWS Lambda 会自动重试受限制的事件,最长可达 6 小时,重试之间会有延迟。请记住,异步事件在用于调用 Lambda 函数之前会先排队。
因此,看起来如果你设置了一个并发限制(所有功能默认设置为 1000),那么 AWS 要么给你一个 429 状态代码(用于请求-响应),要么自动排队并重试你的功能长达 6 小时。
但它没有具体说明重试之间的延迟功能是如何工作的。