【发布时间】:2019-06-23 15:08:22
【问题描述】:
我向 SQS 添加了一堆 s3 路径,然后 lambda 会根据 SQS 队列自动触发。仅在队列为空后如何触发作业运行?
这似乎是一个挑战,因为如果我将它设置为在队列为空时触发,它将在作业运行之前无限触发。如果我将它设置为在当前值为 0 且前一个值为非零时触发,如果它非常快地处理前几个条目,我可能会在完整作业完成之前意外触发它。
当一个 sqs 在处理数据后最近达到 0 个条目时,我如何设置一个回调来运行 lambda?
【问题讨论】:
-
您能否为我们描述一下为什么您希望在队列为空时触发 Lambda 函数?这不是松散耦合系统的常见要求。这也很困难,因为即使 Lambda 函数正在处理消息,队列也可能显示为“空”。
-
为了符合 GDPR,我们有一个阶梯函数。 step 函数用于处理 s3 存储桶中的所有文件,然后仅在该步骤完成后继续。第一步是 lambda 递归扫描 s3 存储桶并将所有路径发送到 SQS。为修改原始 s3 文件的每个 SQS 消息执行一个 lambda。有一种方法可以在添加 s3 路径后临时添加一次运行触发器,因为当 sqs 计数为 0 时,将允许 step 函数检测工作何时完成并继续。
-
您真的需要等待吗?实际等待的业务需求是什么,而不是将数据传递给另一个函数,知道它将执行。如果不等待,是否会处理不正确的内容?如果您想 100% 确定,您可以重新构建它,以便 Step Function 直接触发 Lambda 函数,而不是使用队列。这样,它将被管理而不是松散耦合。
-
SQS 为空后,下一个 lambda 会检查 lambda 错误和任何未成功处理的死信项。如果任何单元测试失败,它会通过电子邮件向我发送人工干预。如果成功,它将通过电子邮件向其他人发送通知,通知他们合规任务已完成。
标签: amazon-web-services aws-lambda amazon-sqs