【问题标题】:Triggering Lambda on basis of multiple files基于多个文件触发 Lambda
【发布时间】:2020-05-14 17:27:48
【问题描述】:

我有点困惑,因为当 s3 中有多个特定文件可用时,我需要运行 AWS 粘合作业。在 s3 中的每个文件放置事件上,我都会触发一个 lambda,该 lambda 将该文件元数据写入 dynamodb。在 dynamodb 中,我还维护了一个计数器,用于计算存在的所需文件的数量。

但是当一次上传多个文件时,会触发多个 lambda,它们几乎同时在 dynamodb 中写入,这会影响计数器;因此计数器无法准确计数。

当特定(多个)文件在 s3 中可用时,我需要一种更好的方式来开始工作。

请提出更好的方法。

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda amazon-dynamodb


    【解决方案1】:

    Dynamo 默认情况下最终一致。您需要请求高度一致读取以保证您读取的数据与写入的数据相同。

    有关更多信息,请参阅this page,或者有关更具体的示例,请参阅GetItem docs 中的 ConsistentRead 标志。

    值得注意的是,这些只会最大限度地减少您的问题。在读/写之间也会有一个非常小的窗口,其中网络延迟导致一个函数读/写,而另一个函数也在这样做。您应该考虑一次只允许一个函数运行,或者其他一些逻辑来保证对数据库的互斥访问。

    【讨论】:

      【解决方案2】:

      听起来您正在获取当前计数,在 Lambda 函数中将其递增,然后使用新值更新 DynamoDB。相反,您需要使用DynamoDB Atomic Counters,这将确保多个并发更新不会导致您描述的问题。

      通过使用原子计数器,您只需向 DynamoDB 发送一个请求,将您的计数器增加 1。如果您的 Lambda 需要检查这是否是您在执行其他工作之前等待的最后一个文件,那么您可以使用来自更新调用以检查新计数是多少。

      【讨论】:

        【解决方案3】:

        不确定您所说的“特定”(多个)文件是什么意思。

        如果您需要特定的文件名(或“模式”),那么您可以将所有预期的文件作为 lambda 函数的第一条指令进行检查。 IE。您期望文件:A.txt、B.txt、C.txt,然后测试您的 s3 存储桶是否包含这 3 个特定文件(或 3 个 *.txt 文件或任何适合您要求的文件)。如果是这种情况,则继续处理,如果不是,则来自函数的return。在并发调用的情况下,这在技术上是可行的。

        【讨论】:

        • 对于许多文件中的一些文件,我需要增加计数器。另外我不喜欢安排 lambda,而是需要在文件出现在 s3 时立即识别。
        猜你喜欢
        • 2020-11-13
        • 2020-05-05
        • 2012-10-21
        • 1970-01-01
        • 2022-11-09
        • 2020-03-14
        • 2021-10-10
        • 2020-06-30
        • 2015-11-10
        相关资源
        最近更新 更多