amazon-web-services - 如何在多个 S3 通知上仅触发一次 AWS Lambda
问题描述
我们正在设计一个管道。我们得到一些进入 S3 存储桶的原始文件,然后我们应用一个模式,然后将它们保存为 parquet。
到目前为止,我们正在为每个写入的文件触发一个 lambda 函数,但理想情况下,我们希望仅在写入所有文件后才开始此过程。我们怎样才能触发 lambda 一次?
解决方案
我鼓励您使用一种替代方案,以保持发布者(无论谁在写作)和订阅者(您)之间的分离。出版商会告诉你什么时候写的;您有责任选择何时处理这些事情。这里的简洁模式是让发布者分批编写其文件并发布清单供您触发:即一个列表,上面写着“我刚刚写了所有这些东西,你可以在这些地方找到它们”。由于您没有该/无法更改发布者,因此我建议以下内容:
将通知从发布者发送到SQS 队列。
安排您的 lambda 按计划运行;多久取决于您愿意延迟摄入多长时间。如果您希望数据在发布和被系统摄取之间最多延迟 5 分钟,请将您的 lambda 设置为每 4 分钟触发一次。您可以为此使用 Cloudwatch 通知。
当您的 lambda 运行时,轮询队列。继续前进,直到您累积了最大数量的通知 X,您想一次性处理,或者队列为空。
过程。如果停止轮询时队列不为空,则立即触发另一个 lambda 执行。
以上注意事项:
如所写,它不是并行的,因此如果您的 lambda 执行速度比队列填满的速度慢,您需要 1. 更频繁地运行或 2. 插入负载平衡步骤:一个 lambda按计划触发,轮询队列,并根据需要调用尽可能多的处理 lambda,以便每个都收到 X 通知。
一般的 SNS 和 SQS 非 FIFO 队列具体不保证完全一次交付。他们可以向您发送重复的通知。确保您可以干净地处理重复处理。
推荐阅读
- python - 如何在 tweepy 的一条推文中搜索多个单词?
- windows - 如何在 Visual Studio 2019 社区版中打开新的 MonoGame 桌面项目?
- string - 使用 malloced 字符串创建 Rust 字符串是否安全?
- javascript - 切换 Bootstrap 4 桌面导航的滑入式动画
- java - 如何创建具有多个端点的heroku服务器以进行方形支付?
- javascript - 修改从已呈现可见空白的网页复制文本的方式
- jquery - 提交时如何使用 jQuery keydown 选择两个提交按钮之一?
- javascript - TypeScript 和 event.target || event.srcElement
- java - 在命令提示符下使用 powershell 运行 java 可执行文件
- javascript - 调用 React 组件但未正确渲染