Amazon web services AWS步骤函数:如何在步骤函数中调用同一lambda的多个实例

Amazon web services AWS步骤函数:如何在步骤函数中调用同一lambda的多个实例,amazon-web-services,state-machine,aws-step-functions,Amazon Web Services,State Machine,Aws Step Functions,我有一个SQS队列,我从状态机监视它的大小 如果size>required size,则触发一些lambda函数,否则,它将等待30秒并再次检查队列大小 这是我的问题:当队列长度为20000时,我想触发10个lambda函数以更快地清空它。如果它的长度是,则不要深入研究您提出的解决方案,并专注于为您的问题提供指导 所以,如果你看到了,你必须自己回答这个问题。最简单的解决方案是再执行一个名为invoke10Lambdas的步骤,并根据您的选择使用它。step函数的伪代码如下所示 .... ....

我有一个SQS队列,我从状态机监视它的大小

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


这是我的问题:当队列长度为20000时,我想触发10个lambda函数以更快地清空它。如果它的长度是
,则不要深入研究您提出的解决方案,并专注于为您的问题提供指导

所以,如果你看到了,你必须自己回答这个问题。最简单的解决方案是再执行一个名为
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)"
},
...
...


AWS Step函数似乎不是您场景中的最佳工具。我想你应该用一个。在您的案例中,它应该是可见的
。如果
approximateEnumberOfMessagesVisible
>=20000,则可以创建报警。该警报的操作可能是SNS主题,您可以订阅Lambda函数。在Lambda函数中,可以异步调用Lambda函数10次,以清除队列

退房

使用步骤函数:

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

SQS现在支持使用,因此建议让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"
            ]
          ]
        }
      }
    }
如果您真的打算使用一个step函数来推动这一点,那么您可以在当前拥有的基础上创建另一个选项

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

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

  • B1
    -等待30分钟,然后
    下一步:A

  • B2
    -与9个lambda并行(因为10是
    a
    )=>
    下一步:a

其他备选方案包括:

  • CloudWatch事件计划每30秒触发一次

  • 直接从单独的lambda触发10个并行lambda函数。lambda可以检查大小,然后以异步方式直接调用其他lambda。因为结果是什么并不重要,因为我们将在30秒后再次检查,所以step函数将重试


您建议的方法的最大问题是步长函数有1年的限制,因此除非您确定队列将在一年内耗尽,否则当您到达终点时,您将遇到问题。即使您将其设置为重新触发新的step函数,您也将支付大量不必要的阶跃转换(阶跃函数不是最便宜的)。AWS阶跃函数现在支持动态并行,因此您可以优化应用程序工作流(如数据处理和任务自动化)的性能和效率。通过并行运行相同的任务,您可以实现一致的执行持续时间,并提高资源利用率以节省运营成本。Step函数根据您的输入自动缩放资源


您能告诉我们检查队列大小的代码吗?另一方面,为什么不将lambda函数配置为连续处理队列?@guzmonne lambda连续处理队列,但如果队列大小较大,则单个lambda需要2小时才能完成。我的意思是,您可以将lambda函数配置为直接从SQS队列读取。我们将根据队列中的消息量来管理耗尽队列所需的函数量。这样做不需要阶跃函数。请检查:
"EventSourceMapping": {
      "Type": "AWS::Lambda::EventSourceMapping",
      "Properties": {
        "BatchSize": 10,
        "Enabled": true,
        "EventSourceArn" : { "Fn::GetAtt" : ["SQSStandupWork", "Arn"] },
        "FunctionName" : {
          "Fn::Join": [
            ":", [
              { "Fn::GetAtt" : ["LambdaFunction", "Arn"] },
              "production"
            ]
          ]
        }
      }
    }