amazon-web-services - 使用 Lambda 保证在 SQS 队列中处理文件的模式

标签 amazon-web-services amazon-s3 amazon-sqs

我有一个非常简单的任务要对许多文件执行,因为它们被上传到 S3 存储桶。该任务可以通过一个简单的 Lambda 函数轻松执行,并将生成的文件写回 S3。

将此 Lambda 函数连接到由 S3 事件触发的事件是微不足道的,但我有一些额外的复杂性:

  1. 必须处理文件(如果 Lambda 函数失败,则需要再次尝试该操作,直到成功为止,给定合理的重试次数)

    <
  2. 我需要知道所有文件何时处理完毕

在我看来,在系统 (SQS) 中放置一个消息队列似乎是一个明智的选择。这样,任何失败的消息都将在可见性超时后重试。此外,我将能够查询队列长度以查看是否还有未完成的操作。

我可以将 S3 事件连接到 SQS 队列。 问题是我无法直接从 SQS 队列触发 Lambda 调用。

File --> S3 --> SQS --??--> Lambda ----> S3
                                    \
                                     `-> If successful delete message from SQS

我可以使用 Kinesis 从队列中获取消息并触发 lambda 函数,但这似乎有点矫枉过正?同样,我可以让专用实例轮询队列并对其进行操作,但对于这样一个简单的功能,我真的不想运行一个实例集群。

有好的设计模式吗?

最佳答案

对于直接从 S3 到 Lambda,我认为您是对的,您需要担心 lambda 函数无法正常工作/崩溃以及没有发生对特定 S3 对象的处理。

话虽如此,我建议直接将 S3 与 Lambda 结合使用一种机制,该机制允许您检测并重新请求处理未能处理的项目(即保姆)。您可以通过 Lambda ( http://docs.aws.amazon.com/lambda/latest/dg/with-scheduled-events.html ) 定期安排一个作业来查找未处理的旧项目(早于特定阈值)。大多数处理将在直接(快乐)路径上完成。

实现此目的的一种方法是使用具有延迟交付和 lambda 计划功能的 SQS。 所以你会有

File --> S3 --> Lambda --> S3 (happy path)
             \-> SQS (delayed)
                  \-> Lambda(scheduled job) -> S3 (unhappy path)

在预定的作业中,您可以检查是否进行了处理并确认消息。计划的作业可以触发用于正常处理的相同 Lambda 作业。 另外,不要忘记为 SQS 队列配置一个死信队列,以捕获多次重试后处理失败的事情。

请记住,如果您有办法通过检查 S3 存储桶来确定已处理的内容和未处理的内容,则您可能会完全绕过 SQS。

另请记住,以上所有假设都假设您处理已经处理的内容(即涉及 lamda 函数超时、队列延迟和 sqs 交付的边缘情况)

关于amazon-web-services - 使用 Lambda 保证在 SQS 队列中处理文件的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34358180/

相关文章:

amazon-web-services - AWS S3 存储桶中的复制作为数据备份

amazon-web-services - 禁止从私有(private)注册表访问的 AWS EB docker-compose 部署

amazon - 使用 Uploadify 直接发布到 Amazon S3

php - 亚马逊AWS中的任务/队列管理

amazon-web-services - 使用 Terraform 启动 CloudFormationTemplate

node.js - 在 AWS Elastic Beanstalk 上全局安装 npm 包

ruby-on-rails - 在 Rails 项目中设置 Shoryuken、Active Job 和 Amazon SQS

amazon-web-services - AWS SQS消息保留期

javascript - 重复使用多实例的精细 uploader 代码

file-upload - 基于 Amazon S3 浏览器的上传是否支持输入“多选项”?