我对使用Lambda在AWS上进行自动化实时数据处理很感兴趣,但我不确定如何触发我的Lambda函数。我的数据处理代码涉及获取多个文件,并在对每个文件执行计算后将它们连接到单个数据帧中。由于文件是同时上传到S3,文件是相互依赖的,我希望只有当所有文件都上传时才触发Lambda。
当前的方法/尝试:
-I正在考虑使用S3触发器,但我担心的是,在单个文件上传会触发Lambda启动的情况下,S3触发器会导致错误。另一种选择是增加等待时间,但这不是限制使用的计算资源的首选。
使用Cloudwatch/EventBridge的-A计划触发器,但这不是实时处理。
-SNS触发器,但我不确定该消息是否可以在不知道文件上传完成的情况下自动发送。
欢迎提出任何建议!谢谢!
发布于 2021-06-25 02:25:04
如果您确实不能使用调度函数完成此操作,最好的选择是在创建对象时触发Lambda函数。
棘手的一点是它会在每次上传对象时触发你的函数。因此,您可以识别“最后一部分”,例如,基于一些元数据,或者您将需要存储和跟踪所有上传的状态,例如在DynamoDB中,并仅在批处理完成时进行实际处理。
最好的,斯特凡
发布于 2021-06-25 02:31:24
你的文件分成几部分可能会被命名为-
filename_part1.ext
filename_part2.ext如果您的任何系统正在生成这些文件,则使用系统生成最终的虚拟空白文件名,如下所示-
filename.final由于在S3事件触发器中可以使用后缀来生成事件,因此可以使用.final扩展来调用lambda并处理记录。
在另一种方法中,如果您不能访问服务器将对象放入您的s3存储桶中,那么对于您的s3存储桶中的每个PUT操作,调用lambda并在dynamoDB中插入一个条目。你需要在每个文件(而不是文件部分)中放一个唯一的条目,用-
filename and last_part_recieved_timelast_part_recieved_time会不断更新,直到您不断获取文件部分。
现在,可以通过cron lambda调用查找该表,该调用检查时间偏差( lambda调用的SYSTIME和dynamoDB entry -last_part_recieved_time之间的时间差)是否足以处理记录。
我仍然倾向于使用第一种方法,因为第二种方法仍然有可能出错。
https://stackoverflow.com/questions/68119755
复制相似问题