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)
所以我不确定这到底是什么意思 Maximum execution history size is 25,000 events
术语“执行历史记录”用于描述配额文档中的两个完全不同的事物,这导致了您的困惑(以及我的困惑,直到我意识到这一点):
只要每次执行在 25k 步以内完成,以便单次运行的执行历史记录小于 25k,那么您就可以按照您的意愿执行状态机(远多于 25k 次):)
更新:自 2022 年 12 月起,您可以使用分布式地图来避免此 25k 配额。我们现在使用它通过 1 个状态机来管理后台处理的大型队列,这将达到 25k 的限制。我们在 100k 范围内迭代。
我不认为你说得对。状态机执行历史记录的限制为 25,000。您已经测试了 26,000 次状态机执行。状态机执行限制为 1,000,000 次开放执行。
状态机最多可以运行 1 年,在此期间其执行历史记录不应超过 25,000 次。
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |