Amazon web services AWS步骤函数:如何在步骤函数中调用同一lambda的多个实例
我有一个SQS队列,我从状态机监视它的大小 如果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函数的伪代码如下所示 .... ....
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函数来推动这一点,那么您可以在当前拥有的基础上创建另一个选项
-并行执行1个lambda(A
=>停止)+一个检查器(A1
)B
-调用lambda并检查大小返回Wait30(B
如果大小小于2000),如果大小大于20000则返回Parallel(B1
)B2
-等待30分钟,然后B1
下一步:A
-与9个lambda并行(因为10是B2
)=>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"
]
]
}
}
}