【问题标题】:Managing a 'dynamic' AWS Lambda workflow管理“动态”AWS Lambda 工作流程
【发布时间】:2017-08-01 06:29:11
【问题描述】:

假设我有一个名为“TestExecutor”的 Lambda 函数,它接受一个参数,该参数包含 N 个“测试”的 ARN,这些 ARN 也作为 Lambda 函数实现。

工作流程:

  1. TestExecutor 使用各种“测试”的 ARN 列表调用
  2. TestExecutor 同时调用每个Test;每个 Lambda 都应该返回一个 JSON
  3. TestExecutor 等待每个测试完成。它整合了所有收到的 JSON
  4. 整合的 JSON 存储在 DynamoDB/S3 中

问题陈述 - 以无服务器方式创建这种工作流的最佳方式是什么?

我考虑了两个 AWS 服务来管理这个:

  1. AWS Step Functions - 我的 step 函数需要可以执行的每个可能的“测试”Lambda 的状态。我想让用户灵活地调用任何 Lambda,而无需在我的 Step 函数中“注册”它。
  2. AWS SWF - 似乎有点矫枉过正。也遇到与上述相同的问题。

所以现在我能想到的最好的方法就是以简单的方式做到这一点:

在我的 TestExecutor Lambda 中,我可以为 N 个测试创建 N 个线程,每个线程调用一个特定的 Test 的 Lambda 函数。每个线程都等待其 Test 返回 JSON。由于所有执行都成功,所有 JSON 都被合并。整合的 JSON 存储在 DynamoDB 中。

我对这个解决方案不满意 - 从 TestExecutor Lambda 手动管理测试 Lambda 的失败和重试会有点棘手。这是我第一次尝试无服务器,但这似乎是错误的模式。我想对我的工作流程有一个很好的自上而下的视图 - 似乎监控这会有点混乱和分散,因为 TestExecutor 和 Test Lambdas 之间没有正式的联系

也许我可以与每个测试 Lambda 一起创建一个 SQS 队列。对于提供给 TestExecutor 的每个 ARN,我可以将消息推送到相应的队列。但是现在呢?我必须为每个 T 秒轮询每个队列的每个测试创建“侦听器”Lambda。然后它将调用实际的测试 Lambda。这听起来也很复杂。

很想听听一些建议!干杯。

【问题讨论】:

    标签: amazon-web-services architecture aws-lambda amazon-swf aws-step-functions


    【解决方案1】:

    AWS SWF 不会遇到同样的问题,因为它不需要注册 lambda 函数来调用它。 SWF 的主要限制是仍然无法将决策程序进程作为 lambda 函数运行。所以你必须在其他地方运行它。如果您已经有一些可以运行它的主机,那么使用 AWS Flow Framework 实现您的用例非常简单。

    【讨论】:

    • 当然我可以在没有“注册”的情况下调用 Lambda 函数。但是,使用 SWF 有什么意义呢?什么是增值?我仍然会有 1 个“TestExecuter”Lambda 在后台运行“invisible”测试 Lambda。我不会仍然遇到与 Step Functions 相同的问题吗?我将阅读更多关于 SWF 的内容。另外,由于没有 Python SDK,我无意使用 Flow 框架。
    • 附加值是决策函数是无状态的。因此,托管它的进程的任何失败都不会导致进度状态的丢失。 SWF 也是完全事务性的,不会产生重复(如 SQS)。所以编写决策逻辑要简单得多。如果您使用的是 Java,那么您的用例将被编写成十几行代码。
    • 如果我有一个 SQS 队列和我自己的“决策者”TestExector lambda,它每 5 秒轮询一次队列并运行所需的任何测试,该怎么办?在我看来,这将更短更简单。您能否详细说明“SWF 也是完全事务性的,不会产生重复”部分?
    • AFAIK SQS 的“重复”问题是我们无法避免将重复消息插入 SQS。这是我可以在填充 SQS 的客户端层处理的问题。
    【解决方案2】:

    您可以利用 AWS 开发工具包在 Lambda 函数中使用所述 ARN 生成 Step Machine。

    之后需要某种方式进行清理,和/或避免重复,否则控制台会很快变得混乱。

    【讨论】:

      猜你喜欢
      • 2017-11-25
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 2019-09-04
      • 2021-08-14
      • 2019-06-25
      相关资源
      最近更新 更多