假设我有一个名为“TestExecutor”的 Lambda 函数,它接受一个参数,该参数包含 N 个“测试”的 ARN,这些 ARN 也作为 Lambda 函数实现。
工作流程:
- 使用各种“测试”的 ARN 列表调用 TestExecutor
- TestExecutor 并发调用每个Test;每个 Lambda 都应该返回一个 JSON
- TestExecutor 等待每个测试完成。它整合了所有收到的 JSON
- 合并的 JSON 存储在 DynamoDB/S3 中
问题陈述 - 以无服务器方式创建这种工作流的最佳方式是什么?
我考虑了两个 AWS 服务来管理这个:
- AWS Step Functions - 我的 step 函数需要可以执行的每个可能的“测试”Lambda 的状态。我想让用户灵活地调用任何 Lambda,而无需在我的 Step 函数中“注册”它。
- 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。这听起来也很复杂。
很想听听一些建议!干杯。