我目前正在使用AWS进行无服务器的CSV处理 . 熟悉EC2和Dynamo . 我确信有更好的方法来构建它,我找不到一种有效的方法来存储数据 . 任何架构建议将不胜感激 .
此流程将采用上载到S3的CSV,处理元组的所有行,并将新的已处理数据CSV输出到S3 .
1)最佳架构是什么,2)在队列完成之前存储数据的最佳位置,直到可以构建CSV
数据流和服务架构:
CSV(包含元组)(S3) - > CSV处理(Lambda) - >队列(SNS) - >队列处理(Lambda) - > ?????在写入CSV之前已经处理的队列项的临时存储???? (在这里使用什么?) - > CSV构建(Lambda) - > CSV存储(S3)
聪明的想法赞赏 .
2 回答
我相信你的事情太复杂了
当事件发生时,s3可以触发调用lambda函数 . 这是在s3存储桶事件通知中直接设置的
因此,使用此选项可在另一个存储桶中创建CSV的转换版本
亚马逊有一个如何在这里做这种事情的例子
http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html
更新(回复this comment):
如果您已经知道单个Lambda在其时间限制内可以处理多少元组,则可以平均分配任务 .
例如,给出以下信息......
原始CSV包含50,000个元组
单个Lambda可以在时间限制内处理5000个元组 .
然后,您可以对处理器Lambda执行10次并行异步调用,每个处理器使用不同的
offset
.原始答案:
您可以使用两个Lambdas:
听众
S3触发的Lambda,其唯一的工作是将新上载的CSV的s3路径传递给Processor Lambda .
处理器
由监听器触发的Lambda . 它将需要
s3 path
和offset
作为参数(其中offset
是应该开始处理的CSV行) .此Lambda执行CSV行的实际处理 . 它应该跟踪它当前处理的行,并且在达到Lambda时间限制之前,它将停止并使用相同的
s3 path
调用自身,但是使用新的offset
.所以,基本上,它是一个递归的Lambda,在处理所有CSV行之前调用它自己 .
要检查剩余时间,可以在处理程序的
while
或for
循环中使用context.getRemainingTimeInMillis()
方法(NodeJS) .