我使用step函数进行大循环,到目前为止没问题,但是当我的循环超过8000次执行时,我遇到了错误"最大执行历史记录大小"这是25000。
有没有历史事件的解决方案吗?
否则,我可以轻松迁移我的步骤函数(3 lambda)因为aws批处理会问我很多代码重写...
非常感谢
答案 0 :(得分:3)
避免25k历史事件限制的一种方法是在循环中添加一个选择状态,它接受计数器或布尔值并决定退出循环。
在循环之外,你可以放置一个lambda函数来启动另一个执行(具有不同的id)。在此之后,您当前的执行正常完成,另一次执行将继续完成工作。
请注意" LoopProcessor"在下面的示例中,必须返回一个变量" $ .breakOutOfLoop"打破循环,循环中必须确定循环并通过。
根据您的使用情况,您可能需要重新调整传递的数据。例如,如果要处理大量数据,则可能需要考虑使用S3对象并通过状态机执行将ARN作为输入/输出传递。如果你试图做一个简单的循环,一个简单的方法是添加一个起始偏移量(想想它作为一个全局计数器),作为输入传递给执行,每个LoopProcessor任务将增加一个计数器(开始偏移量作为初始值)。这类似于分页解决方案。
以下是避免25k历史事件限制的ASL结构的基本示例:
{
"Comment": "An example looping while avoiding the 25k event history limit.",
"StartAt": "FirstState",
"States": {
"FirstState": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next": "ChoiceState"
},
"ChoiceState": {
"Type" : "Choice",
"Choices": [
{
"Variable": "$.breakOutOfLoop",
"BooleanEquals": true,
"Next": "StartNewExecution"
}
],
"Default": "LoopProcessor"
},
"LoopProcessor": {
"Type" : "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:ProcessWork",
"Next": "ChoiceState"
},
"StartNewExecution": {
"Type" : "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:StartNewLooperExecution",
"Next": "FinalState"
},
"FinalState": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"End": true
}
}
}
希望这有帮助!
答案 1 :(得分:1)
为了保证所有步骤及其命令的执行,step函数存储每个状态完成后的执行历史,这个存储是历史执行大小限制背后的原因。
话虽如此,缓解此限制的一种方法是遵循@sunnyD回答。但是,它有以下限制
另一种替代解决方案是将步骤功能安排为父步和子步功能。在这种安排中,父步骤函数包含循环遍历整个数据集的任务,并为每个记录或记录集创建子步骤函数的新执行(一个不会超过子SF的历史执行限制的数字)在你的数据中。父步骤函数的第二步将等待一段时间,然后检查Cloudwatch指标以完成所有子函数,并退出输出。
关于这个解决方案,要记住的事情很少,