如何解决AWS Lambda-从长列表/ s3中读取时的最佳做法
我有一个预定的错误处理lambda,我想在这里使用无服务器技术而不是Spring Boot服务之类的东西。
lambda将从s3存储桶中读取并进行相应处理。问题是有时s3存储桶可能要处理大量数据。长时间运行的操作不适合lambda。
我能想到的一个解决方案是让lambda读取并处理存储桶中的一项,并成功触发同一lambda的另一个实例,除非存储桶为空/已完全处理。我不喜欢的是,这是同步的并且相当慢。我还需要意识到在错误流中遇到REST端点的同时要运行太多的lambda,并且不想让过多的请求使它过载。
我认为最好同时运行3个lambda实例,直到存储桶为空,但不确定,我想知道是否有人可以在此处使用任何不错的模式或建议最佳做法?
谢谢
解决方法
创建一个S3存储桶以处理文件。
启用触发器S3-> Lambda,在存储桶中的每个新文件上,lambda将被调用以处理该文件,每个文件都被单独处理。 https://docs.aws.amazon.com/AmazonS3/latest/user-guide/enable-event-notifications.html
处理完文件后,您可以删除文件或将文件移动到其他位置。
关于并发,请查看预配置的并发https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html
更新: 由于您仍打算使用调度程序lambda和S3
- Lambda仅读取/列出文件名,并将消息放入SQS中以处理文件。
- 一个新的Lambda来使用SQS消息并处理文件。
注意:如果文件/消息不是很大,我建议先使用SQS,它已经建立了恢复机制,DLQ,延迟,可见性等,您可以从简单的S3存储中受益更多,第二种方法是创建带有文件参考的消息,并且仍在使用SQS。
,我将调度程序调用的lambda与进行实际处理的lambda分开。调度程序调用第一个Lambda时,它可以查看存储桶中的内容,然后生成工作Lambda来处理对象。这样,您可以控制每个工作人员想要多少个对象。
,鉴于您的要求,我建议:
- 配置Amazon S3事件,以便在S3存储桶中创建对象时将消息推送到Amazon SQS队列
- 定期安排AWS Lambda函数,该函数将:
- 检查外部服务是否正常工作
- 调用Lambda函数来处理队列中的一条消息,并保持循环
最困难的部分是限制第二个Lambda函数,以便它不会尝试一次发送所有请求(这可能会影响该外部服务)。
您可能可以通过使用“步进函数”来触发Lambda,然后执行此操作(如果成功的话)来触发另一个Lambda函数。这甚至可以并行完成,例如最多允许三个并行Lambda执行。使用“步进功能”的好处是,无需为每个Lambda“等待”完成执行而花费任何费用。
因此,Step Function流程类似于:
- 调用“检查外部服务” Lambda函数
- 如果失败,则退出流程
- 调用“处理” Lambda函数
- 收到一条消息
- 处理消息
- 如果成功,则从队列中删除消息
- 返回成功/失败
- 如果成功,则继续循环直到队列为空
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。