AWS Step功能历史事件限制

时间:2017-07-03 10:01:43

标签: amazon-web-services aws-lambda aws-step-functions

我使用step函数进行大循环,到目前为止没问题,但是当我的循环超过8000次执行时,我遇到了错误"最大执行历史记录大小"这是25000。

有没有历史事件的解决方案吗?

否则,我可以轻松迁移我的步骤函数(3 lambda)因为aws批处理会问我很多代码重写...

非常感谢

2 个答案:

答案 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
    }
  }
}

Loop Processor Example

希望这有帮助!

答案 1 :(得分:1)

为了保证所有步骤及其命令的执行,step函数存储每个状态完成后的执行历史,这个存储是历史执行大小限制背后的原因。

话虽如此,缓解此限制的一种方法是遵循@sunnyD回答。但是,它有以下限制

  1. 步进函数的调用程序(如果有的话)将不会获得完整数据的执行输出。相反,他在执行链中获得第一次执行的输出。
  2. 执行历史记录大小的限制很有可能在未来版本中增加,因此在此数字上编写逻辑将要求您在每次增加或减少限制时修改代码/配置。
  3. 另一种替代解决方案是将步骤功能安排为父步和子步功能。在这种安排中,父步骤函数包含循环遍历整个数据集的任务,并为每个记录或记录集创建子步骤函数的新执行(一个不会超过子SF的历史执行限制的数字)在你的数据中。父步骤函数的第二步将等待一段时间,然后检查Cloudwatch指标以完成所有子函数,并退出输出。

    关于这个解决方案,要记住的事情很少,

    1. startExecution API将以500桶大小进行节流,每秒25次重新填充。
    2. 确保您在父SF中的等待时间足以让子SF完成其执行,否则实现循环以检查子SF的完成。