AWS Step Functions历史事件限制

6

我使用步骤函数来实现一个大循环,目前没有问题,但是当我的循环执行次数超过8000次的时候,我遇到了"最大执行历史记录大小"错误,该错误为25000。

有没有不需要历史事件的解决方案?

否则,我在哪里可以轻松迁移我的步骤函数(3个 Lambda),因为aws批处理将要求我大量重写代码...

非常感谢。

2个回答

6
避免历史事件数量限制的一种方法是在循环中添加一个选择状态,该状态接收计数器或布尔值并决定退出循环。
在循环外部,您可以放置一个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
    }
  }
}

循环处理器示例

希望这能帮到你!


4
为了保证所有步骤的执行顺序,步骤函数在每个状态完成后存储执行历史记录,这种存储是限制历史执行大小的原因。
话虽如此,缓解此限制的一种方法是遵循@sunnyD的答案。然而,它有以下限制:
1.步骤函数的调用者(如果有)将无法获得完整数据的执行输出。相反,他会得到执行链中第一个执行的输出。 2.执行历史记录大小的限制有很高的机会在未来版本中增加,因此编写关于此数字的逻辑需要您每次修改代码/配置时都进行修改。
另一种替代解决方案是将步骤函数排列为父子步骤函数。在这种安排中,父步骤函数包含一个任务,循环遍历整个数据集,并为每个记录或记录集创建新的子步骤函数执行(不会超过子SF的历史执行限制)。父步骤函数中的第二步将等待一段时间,然后检查Cloudwatch指标以获取所有子函数的完成情况,并输出结果退出。
请注意以下几点:
1. startExecution API将在每秒25个回流、500个桶大小处进行限流。 2. 确保父SF中的等待时间足够长,使子SF能够完成其执行,否则实现循环以检查子SF的完成情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接