【问题标题】:Challenges of using AWS Lambda chain使用 AWS Lambda 链的挑战
【发布时间】:2018-09-18 08:42:28
【问题描述】:

背景: 我有一个由 6 个 lambda 函数组成的管道(链接在一起),由 SNS 通知触发,该通知在文件登陆 S3 时生成。该管道实质上获取文件(几 GB),对其进行过滤(创建 Spark 集群以运行作业,然后在最后删除),并将其插入数据库。 Lambda 正在编排流程。

问题: 如果一个 Lambda 失败,则链会中断,因此无法进行有效的故障处理。其次,如果轮询/计算时间超过 5 分钟,我们会遇到超时,因此没有有效的重试。如果 lambda 失败,则需要很长时间来测试/调试问题。也没有可见性,例如有多少工作失败,有多少通过?我们不知道。通过电子邮件获取大量 SNS 通知并不是非常有效/有用。如果链中断,我们将无法执行清理操作,例如删除 SPark 集群或内务步骤。

我的问题: AWS Step Functions 是解决上述问题的好选择吗?您什么时候不使用 Step Function 服务?如果您无法通过 SNS 调用 Step Function,那么每当文件登陆 S3 时调用它的最佳方式是什么?随意分享任何其他方法来轻松有效地解决此用例。

【问题讨论】:

标签: amazon-web-services aws-lambda serverless aws-step-functions


【解决方案1】:

是的。您可以在 Step Function 中定义 catch 处理程序来处理失败的 lambdas 并重新运行它们,或者在失败时执行任何您需要的操作。

以下是从文件上传到 S3 触发 Step Functions 的示例:https://aws.amazon.com/blogs/compute/synchronizing-amazon-s3-buckets-using-aws-step-functions/

也就是说,如果您只需要一个简单的重试逻辑,您或许可以使用 SQS 更快地到达那里。当 SQS 客户端从队列中接收到消息时,它们实际上并不会立即被删除,而是 SQS 会保留这些消息。如果客户端在一定时间内没有删除消息,那么这些消息将被放回队列中。

很遗憾,目前无法直接从 SQS 触发 lambda,但您可以设置一个或多个 CloudWatch 事件以定期轮询 SQS。

【讨论】:

  • 感谢 Kim,但我读到 Lambda 函数在失败前会重试 3 次,那么 Step 函数如何带来价值?
  • @obaid Lambda 函数只有在异步调用(例如通过 SNS 触发器)时才会自动重试 3 次。 Step 函数同步调用它们,因此重试逻辑必须由状态机本身定义。
  • 现在我们可以从 sqs 触发 lambda:docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
猜你喜欢
  • 2021-07-06
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多