S3 通知创建多个事件

cha*_*aos 4 amazon-s3 amazon-web-services aws-lambda

当文件登陆 S3 时,我们一直使用 AWS S3 通知来触发 lambda 函数,并且该模型运行良好,直到我们注意到某些文件被多次处理,从而在我们的数据存储中生成重复项。我们注意到大约 0.05% 的文件发生了这种情况。

我知道可以通过执行 upsert 来防止这种情况发生,但我们担心的是运行不必要的 lambda 函数的潜在成本,因为这会影响我们的成本。

我搜索过谷歌和 SO,但只发现了类似的问题。我们没有超时问题,因为文件已被完全处理。我们的文件很小,最大的文件不到 400k。我们不会收到两次相同的事件,因为这些事件具有不同的请求 ID,即使它们在同一个文件上运行。

cha*_*aos 9

在浪费了相当多的时间查看 S3、SNS 和 Lambda 文档之后,我发现了一个关于 S3 通知的注释,内容如下:

如果您的应用程序需要特定的语义(例如,确保不会遗漏任何事件,或操作只运行一次),我们建议您在设计应用程序时考虑遗漏和重复的事件。

https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html

实际上,这意味着 S3 通知对我们来说是错误的解决方案,但考虑到我在这个问题上投入的研究时间,我想我会在这里为可能忽略上面链接页面的其他人贡献这个。

  • 您绝对确定这些事件是具有相同负载的*完美* 副本吗?特别是`responseElements`和`sequencer`?该服务不能保证完美的 1:1,但您报告的比率似乎比我预期的要高,而且我确实有零记录重复实例的环境。就我个人而言,我喜欢使用 S3 > SNS > Lambda,即使 SNS 不是严格需要的,因为这样我就可以将 SQS 队列订阅到 SNS 主题并在该队列中并行捕获事件,以进行单独分析。 (2认同)

小智 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