AWS Step Function:如何在step函数中调用同一lambda的多个实例

时间:2019-07-19 01:09:30

标签: amazon-web-services state-machine aws-step-functions

我有一个SQS队列,可以从状态机监视其大小。

如果size > desired size会触发一些lambda函数,否则它将等待30秒并再次检查队列大小。

这是我的探针:当队列长度为> 20000时,我想触发10个lambda函数以更快地清空它。而且如果它的长度是<2000,那么我只想运行1个lambda函数。

目前,我已经硬编码了十个并行步骤,但是如果队列大小小于2000,则会浪费资源。

            "CheckSize": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.Payload.size",
                  "NumericGreaterThan": 2000,
                  "Next": "invoke_lambda"
                },
                {
                  "Variable": "$.Payload.size",
                  "NumericLessThan": 2000,
                  "Next": "Wait30s"
                }
              ],
              "Default": "Wait30s"
            },

4 个答案:

答案 0 :(得分:0)

不深入研究您提出的解决方案,而是专注于为您的问题提供指导

因此,如果您看到了,就可以自己回答问题。最简单的解决方案是再进行一个名为invoke10Lambdas的步骤,并根据您的选择使用它。您的step函数的伪代码看起来像这样。

....
....
"CheckSizeAndDivert": {
  "Type": "Choice",
  "Choices": [
    {
      "Variable": "$.Payload.size",
      "NumericGreaterThan": 20000,
      "Next": "invoke_10_lambdas"
    },
    {
      "Variable": "$.Payload.size",
      "NumericGreaterThan": 2000,
      "Next": "invoke_lambda"
    }
  ],
  "Default": "Wait30s"
},

"invoke_10_lambdas": {
// This is your parallel step.
...
Next:"whatever next(i believe it is Wait30)"
},

"invoke_lambda": {
...
// This is your single lambda step.
...
Next:"whatever next(i believe it is Wait30)"
},
...
...

答案 1 :(得分:0)

AWS Step Functions在您的方案中似乎不是最好的工具。我认为您应该使用SQS metrics available for CloudWatch之一。根据您的情况,它应该为ApproximateNumberOfMessagesVisible。如果ApproximateNumberOfMessagesVisible> = 20,000,则可以创建警报。该警报的操作可能是SNS主题,您可以向其订阅Lambda函数。在Lambda函数中,您可以异步调用Lambda函数10次,以清除队列。

签出AWS docs for creating a CloudWatch alarm for SQS metric

使用步骤功能:

如果您想使用Step Functions来做,那么我认为您不需要在状态机定义中进行任何条件检查。您所需要做的就是将$ .size传递给Lambda函数,并将条件放入该Lambda函数中。如果size> = 20000,则异步调用队列处理功能10次,否则为1。

答案 2 :(得分:0)

SQS现在支持使用Lambda as a EventSourceMapping,因此建议使AWS直接控制它并根据需要扩展lambda。

示例CloudFormation模板为

"EventSourceMapping": {
      "Type": "AWS::Lambda::EventSourceMapping",
      "Properties": {
        "BatchSize": 10,
        "Enabled": true,
        "EventSourceArn" : { "Fn::GetAtt" : ["SQSStandupWork", "Arn"] },
        "FunctionName" : {
          "Fn::Join": [
            ":", [
              { "Fn::GetAtt" : ["LambdaFunction", "Arn"] },
              "production"
            ]
          ]
        }
      }
    }

如果您真的想使用步进功能来推动这一发展,则可以在当前拥有的功能之上创建另一个选择

  • A-并行执行1个lambda(A1 =>停止)+一个检查器(B

  • B-调用lambda并检查大小,返回Wait30(如果大小小于2000,则返回B1,如果大小> 20000(B2),则返回Parallel。

  • B1-等待30,然后NEXT: A

  • B2-与9个lambda并行(因为10个为A)=> NEXT: A

其他替代方法是:

  • CloudWatch事件以安排每30秒触发一次

  • 直接从单独的lambda触发10个并行lambda函数。 Lambda可以检查大小,然后直接在ASYNC中调用其他Lambda。因为结果无关紧要,因为我们将在30秒后再次检查step函数将重试。

建议的方法最大的问题是,步进函数的限制为1年,因此,除非您确定队列将在一年内耗尽,否则直到结束时都会遇到问题。即使您将其设置为重新触发新的步进功能,也将付出很多不必要的步进转换(步进功能并不是最便宜的)。

答案 3 :(得分:0)

AWS Step Functions现在支持动态并行性,因此您可以优化应用程序工作流(例如数据处理和任务自动化)的性能和效率。通过并行运行相同的任务,您可以实现一致的执行时间并提高资源利用率以节省运营成本。 Step Functions会根据您的输入自动扩展资源。

https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-map-state.html

https://aws.amazon.com/about-aws/whats-new/2019/09/aws-step-functions-adds-support-for-dynamic-parallelism-in-workflows/