AWS step函数能否执行25000次以上?

LP1*_*P13 5 amazon-web-services aws-sdk aws-lambda aws-step-functions

我目前正在评估可处理单个文档的AWS状态机。状态机将花费5-10分钟来处理单个文档。

{
  "Comment":"Process document",
  "StartAt": "InitialState",
  "States": {
          //the document goes through multiple states here
  }
}
Run Code Online (Sandbox Code Playgroud)

C#代码通过为每个文档传递一些json来调用状态机。就像是

      // max 100 documents
      public Task Process(IEnumerable<Document> documents)
      {   
          var amazonStepFunctionsConfig = new AmazonStepFunctionsConfig { RegionEndpoint = RegionEndpoint.USWest2 };
          using (var amazonStepFunctionsClient = new AmazonStepFunctionsClient(awsAccessKeyId, awsSecretAccessKey, amazonStepFunctionsConfig))
          {
            foreach(var document in documents)
            {
                var jsonData1 = JsonConvert.SerializeObject(document);
                var startExecutionRequest = new StartExecutionRequest
                {
                  Input = jsonData1,
                  Name = document.Id, 
                  StateMachineArn = "arn:aws:states:us-west-2:<SomeNumber>:stateMachine:ProcessDocument"
                };
                var taskStartExecutionResponse = await amazonStepFunctionsClient.StartExecutionAsync(startExecutionRequest);                
            }
          }
      }
Run Code Online (Sandbox Code Playgroud)

我们批量处理文件100。因此,在上述循环中,最大文档数将为100。但是,我们每周要处理数千个文档(超过25000个)。

根据AWS文档 Maximum execution history size is 25,000 events. If the execution history reaches this limit the execution will fail

这是否意味着我们不能执行单个状态机超过25000次?为什么状态机的执行应取决于其历史记录,为什么AWS不能仅清除历史记录?

我知道有一种方法可以继续执行新的执行,但是我只是想了解历史限制及其与状态机执行的关系,我的理解是正确的吗?

更新1
我不认为这是重复的问题。我正在尝试了解我对历史记录限制的理解是否正确?为什么历史与状态机可以执行的次数有关?当状态机执行时,它会创建历史记录,如果历史记录超过25000+,则清除它们或将其存档。AWS为什么会停止执行状态机。那没有意义。

那么问题来了,单状态机(唯一的arn)能否在循环中执行25000+次以上?如果我必须创建新的状态机(在25000次执行之后),那该状态机将不会具有不同的arn?

另外,如果我必须遵循链接的SO帖子 ,那么在哪里可以获得当前的执行次数?他也在step函数中循环,而我在step函数中循环

更新2
因此,仅出于测试目的,我创建了以下状态机

{
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Pass",
      "Result": "Hello World!",
      "End": true
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

并执行了26000次而没有失败

    public static async Task Main(string[] args)
    {
        AmazonStepFunctionsClient client = new AmazonStepFunctionsClient("my key", "my secret key", Amazon.RegionEndpoint.USWest2);
        for (int i = 1; i <= 26000; i++)
        {
            var startExecutionRequest = new StartExecutionRequest
            {
                Input = JsonConvert.SerializeObject(new { }),
                Name = i.ToString(),
                StateMachineArn = "arn:aws:states:us-west-2:xxxxx:stateMachine:MySimpleStateMachine"
            };

            var response = await client.StartExecutionAsync(startExecutionRequest);
        }

        Console.WriteLine("Press any key to continue");
        Console.ReadKey();
    }
Run Code Online (Sandbox Code Playgroud)

在AWS控制台上,我能够提取所有26000次执行的历史记录 在此处输入图片说明

所以我不确定这到底是什么意思 Maximum execution history size is 25,000 events

lan*_*lan 6

术语“执行历史记录”用于描述配额文档中的两个完全不同的事物,这导致了您的困惑(以及我的困惑,直到我意识到这一点):

  • 执行历史记录保留 90 天配额:正如您所期望的,这是所有执行的历史记录
  • 执行历史记录大小的 25,000 配额:这是 1 次执行内“状态事件”的历史记录,而不是历史记录中的所有执行。换句话说,如果您的单次执行运行了数千个步骤,从而累积了 25k 个事件(可能是因为工作流中的循环结构),它将突然失败并退出。

只要每次执行在 25k 步以内完成,以便单次运行的执行历史记录小于 25k,那么您就可以按照您的意愿执行状态机(远多于 25k 次):)

更新:自 2022 年 12 月起,您可以使用分布式地图来避免此 25k 配额。我们现在使用它通过 1 个状态机来管理后台处理的大型队列,这将达到 25k 的限制。我们在 100k 范围内迭代。


A.K*_*han 3

我不认为你说得对。状态机执行历史记录的限制为 25,000。您已经测试了 26,000 次状态机执行。状态机执行限制为 1,000,000 次开放执行。

状态机最多可以运行 1 年,在此期间其执行历史记录不应超过 25,000 次。

希望能帮助到你。