我有一个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"
},
答案 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