AWS Step Functions 历史事件限制
AWS Step Functions history event limitation
我在一个大循环中使用步进函数,到目前为止没问题,但是当我的循环执行次数超过 8000 次时,我遇到了错误 "Maximum execution history size",即 25000。
没有历史事件有解决办法吗?
否则,我可以在哪里轻松迁移我的步骤函数 (3 lambda),因为 aws batch 会要求我重写很多代码..
非常感谢
避免 25k 历史事件限制的一种方法是在循环中添加一个选择状态,该状态接受计数器或布尔值并决定退出循环。
在循环之外,您可以放置一个 lambda 函数来启动另一次执行(使用不同的 ID)。在此之后,您当前的执行正常完成,另一个执行将继续完成工作。
请注意,下面示例中的 "LoopProcessor" 必须 return 一个变量“$.breakOutOfLoop”才能跳出循环,它也必须在循环中的某处确定并通过.
根据您的用例,您可能需要重组传递的数据。例如,如果您正在处理大量数据,您可能需要考虑使用 S3 对象并通过状态机执行将 ARN 作为 input/output 传递。如果您正在尝试执行一个简单的循环,一种简单的方法是添加一个开始偏移量(将其视为全局计数器)作为输入传递到执行中,并且每个 LoopProcessor Task 都会递增一个计数器(开始偏移量作为初始值)。这类似于分页解决方案。
这里是 ASL 结构的基本示例,可以避免 25k 历史事件限制:
{
"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
}
}
}
希望对您有所帮助!
为了保证所有步骤及其顺序的执行,步骤函数在每个状态完成后存储执行历史,这种存储是限制历史执行大小的原因。
话虽如此,减轻此限制的一种方法是遵循@sunnyD 的回答。但是,它有以下限制
- 步进函数的调用者(如果有的话)不会得到完整数据的执行输出。相反,他获得了执行链中第一个执行的输出。
- 执行历史记录大小的数量限制在未来的版本中很有可能增加,因此在每次增加或减少限制时,在此数字上编写逻辑将需要您修改 code/configuration。
另一种替代解决方案是将阶梯函数安排为父阶梯函数和子阶梯函数。在这种安排中,父步骤函数包含一个循环遍历整个数据集并为每个记录或记录集创建子步骤函数的新执行的任务(一个不会超过子 SF 的历史执行限制的数字)在你的数据中。父步骤函数中的第二步将等待一段时间,然后检查 Cloudwatch 指标以了解所有子函数的完成情况并退出并输出。
关于此解决方案需要牢记的几点是,
- startExecution API 将限制在 500 个桶大小,每秒 25 次重新填充。
- 确保您在父 SF 中的等待时间足以让子 SF 完成其执行,否则实施循环来检查子 SF 的完成。
我在一个大循环中使用步进函数,到目前为止没问题,但是当我的循环执行次数超过 8000 次时,我遇到了错误 "Maximum execution history size",即 25000。
没有历史事件有解决办法吗?
否则,我可以在哪里轻松迁移我的步骤函数 (3 lambda),因为 aws batch 会要求我重写很多代码..
非常感谢
避免 25k 历史事件限制的一种方法是在循环中添加一个选择状态,该状态接受计数器或布尔值并决定退出循环。
在循环之外,您可以放置一个 lambda 函数来启动另一次执行(使用不同的 ID)。在此之后,您当前的执行正常完成,另一个执行将继续完成工作。
请注意,下面示例中的 "LoopProcessor" 必须 return 一个变量“$.breakOutOfLoop”才能跳出循环,它也必须在循环中的某处确定并通过.
根据您的用例,您可能需要重组传递的数据。例如,如果您正在处理大量数据,您可能需要考虑使用 S3 对象并通过状态机执行将 ARN 作为 input/output 传递。如果您正在尝试执行一个简单的循环,一种简单的方法是添加一个开始偏移量(将其视为全局计数器)作为输入传递到执行中,并且每个 LoopProcessor Task 都会递增一个计数器(开始偏移量作为初始值)。这类似于分页解决方案。
这里是 ASL 结构的基本示例,可以避免 25k 历史事件限制:
{
"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
}
}
}
希望对您有所帮助!
为了保证所有步骤及其顺序的执行,步骤函数在每个状态完成后存储执行历史,这种存储是限制历史执行大小的原因。
话虽如此,减轻此限制的一种方法是遵循@sunnyD 的回答。但是,它有以下限制
- 步进函数的调用者(如果有的话)不会得到完整数据的执行输出。相反,他获得了执行链中第一个执行的输出。
- 执行历史记录大小的数量限制在未来的版本中很有可能增加,因此在每次增加或减少限制时,在此数字上编写逻辑将需要您修改 code/configuration。
另一种替代解决方案是将阶梯函数安排为父阶梯函数和子阶梯函数。在这种安排中,父步骤函数包含一个循环遍历整个数据集并为每个记录或记录集创建子步骤函数的新执行的任务(一个不会超过子 SF 的历史执行限制的数字)在你的数据中。父步骤函数中的第二步将等待一段时间,然后检查 Cloudwatch 指标以了解所有子函数的完成情况并退出并输出。
关于此解决方案需要牢记的几点是,
- startExecution API 将限制在 500 个桶大小,每秒 25 次重新填充。
- 确保您在父 SF 中的等待时间足以让子 SF 完成其执行,否则实施循环来检查子 SF 的完成。