cha*_*aos 4 amazon-s3 amazon-web-services aws-lambda
当文件登陆 S3 时,我们一直使用 AWS S3 通知来触发 lambda 函数,并且该模型运行良好,直到我们注意到某些文件被多次处理,从而在我们的数据存储中生成重复项。我们注意到大约 0.05% 的文件发生了这种情况。
我知道可以通过执行 upsert 来防止这种情况发生,但我们担心的是运行不必要的 lambda 函数的潜在成本,因为这会影响我们的成本。
我搜索过谷歌和 SO,但只发现了类似的问题。我们没有超时问题,因为文件已被完全处理。我们的文件很小,最大的文件不到 400k。我们不会收到两次相同的事件,因为这些事件具有不同的请求 ID,即使它们在同一个文件上运行。
在浪费了相当多的时间查看 S3、SNS 和 Lambda 文档之后,我发现了一个关于 S3 通知的注释,内容如下:
如果您的应用程序需要特定的语义(例如,确保不会遗漏任何事件,或操作只运行一次),我们建议您在设计应用程序时考虑遗漏和重复的事件。
https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html
实际上,这意味着 S3 通知对我们来说是错误的解决方案,但考虑到我在这个问题上投入的研究时间,我想我会在这里为可能忽略上面链接页面的其他人贡献这个。
小智 1
如果重复事件的序列号相同:作为解决方法,您可以考虑向辅助数据库触发通知或使用事件通知维护 S3 对象的索引。然后,存储并比较定序器键值,以在处理每个事件通知时检查重复项。我对如何比较 Lambda 函数中事件通知的唯一值进行了额外研究,并发现文章 [1] 可能有助于实现这一目标。此外,还请查看外部文章[2]、[3]以获取示例代码以供参考,并确保在生产中实现之前在您的开发环境中进行测试。
参考:
[1] https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-idempot/
[2] https://cloudonaut.io/your-lambda-function-might-execute-twice-deal-with-it/
[3] https://adrianhesketh.com/2020/11/27/idempotency-and-once-only-processing-in-lambda-part-1
| 归档时间: |
|
| 查看次数: |
2123 次 |
| 最近记录: |