AWS Step Functions - 将数据批量发送到 Child/Nested Step Function 状态机
AWS Step Functions - Batch Send Data to Child/Nested Step Function State Machine
我正在寻找一种将数据从专利状态机批量发送到子状态机的方法,一次发送 50 条记录。
这是什么意思?
我有两个 AWS Step Functions 状态机。一个父子状态机。父状态机的目的是从我们的 Jenkins 平台获取所有用户。它看起来像这样:
Comment: >-
A state machine that coordinates the end-to-end process for Jenkins
StartAt: Get Jenkins Users
States:
Get Jenkins Users:
Type: Task
Resource: "${JenkinsUsersFunctionArn}"
TimeoutSeconds: 65
HeartbeatSeconds: 30
Retry:
- ErrorEquals:
- Lambda.ServiceException
- Lambda.AWSLambdaException
- Lambda.SdkClientException
- States.Timeout
IntervalSeconds: 2
MaxAttempts: 3
BackoffRate: 2
Catch:
- ErrorEquals:
- States.ALL
ResultPath: "$"
Next: Process Error
ResultPath: "$"
Next: Filter Jenkins Users
这会输出一个对象数组,其中约有 1,500 个对象到 $.users
对象。
我想做的是将所有 1,500 个对象发送到子状态机,我想一次只发送 50 个。这意味着如果有 1,500 个对象,它将总共调用 30 个状态机。
我想到了这样的东西:
Filter Jenkins Users:
Type: Map
InputPath: "$.users"
MaxConcurrency: 50
Iterator:
StartAt: Filter
States:
Filter:
Type: Task
Resource: arn:aws:states:::states:startExecution
Parameters:
StateMachineArn:
Input:
Users: "$"
AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$: "$$.Execution.Id"
End: true
ResultPath: "$.users"
Next: Success State
但这同时启动了 50 个状态机,这不是我想要的。我想批量发送 50 个对象到子状态机。
我为什么要这样做?
如果我要在一个状态机中处理所有这些,我会遇到很多限制,我试图将它拆分为多个步进函数状态机以确保我不会遇到任何限制。
这可能吗?
此处的限制基于每个区域的整个 AWS 账户。所以如果你分裂,你仍然有那个限制。
无论如何,这就是我的做法。
- 改为使用您的 lambda return 一个数组中有 1500 个用户,将其分块为每个分块 50 个用户
- 使用并发为 1 的 Map 状态,输入是分块数组(50 个)
"${JenkinsUsersFunctionArn}"
期望 return 这个
{
"users": [
[
50 users...
],
[
50 users...
],
...
[
15 users...
]
]
}
这是您的地图状态
Filter Jenkins Users:
Type: Map
InputPath: "$.users"
MaxConcurrency: 1
Iterator:
StartAt: Filter
States:
Filter:
Type: Task
Resource: arn:aws:states:::states:startExecution
Parameters:
StateMachineArn:
Input:
Users: "$"
AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$: "$$.Execution.Id"
End: true
ResultPath: "$.users"
Next: Success State
我正在寻找一种将数据从专利状态机批量发送到子状态机的方法,一次发送 50 条记录。
这是什么意思?
我有两个 AWS Step Functions 状态机。一个父子状态机。父状态机的目的是从我们的 Jenkins 平台获取所有用户。它看起来像这样:
Comment: >-
A state machine that coordinates the end-to-end process for Jenkins
StartAt: Get Jenkins Users
States:
Get Jenkins Users:
Type: Task
Resource: "${JenkinsUsersFunctionArn}"
TimeoutSeconds: 65
HeartbeatSeconds: 30
Retry:
- ErrorEquals:
- Lambda.ServiceException
- Lambda.AWSLambdaException
- Lambda.SdkClientException
- States.Timeout
IntervalSeconds: 2
MaxAttempts: 3
BackoffRate: 2
Catch:
- ErrorEquals:
- States.ALL
ResultPath: "$"
Next: Process Error
ResultPath: "$"
Next: Filter Jenkins Users
这会输出一个对象数组,其中约有 1,500 个对象到 $.users
对象。
我想做的是将所有 1,500 个对象发送到子状态机,我想一次只发送 50 个。这意味着如果有 1,500 个对象,它将总共调用 30 个状态机。
我想到了这样的东西:
Filter Jenkins Users:
Type: Map
InputPath: "$.users"
MaxConcurrency: 50
Iterator:
StartAt: Filter
States:
Filter:
Type: Task
Resource: arn:aws:states:::states:startExecution
Parameters:
StateMachineArn:
Input:
Users: "$"
AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$: "$$.Execution.Id"
End: true
ResultPath: "$.users"
Next: Success State
但这同时启动了 50 个状态机,这不是我想要的。我想批量发送 50 个对象到子状态机。
我为什么要这样做?
如果我要在一个状态机中处理所有这些,我会遇到很多限制,我试图将它拆分为多个步进函数状态机以确保我不会遇到任何限制。
这可能吗?
此处的限制基于每个区域的整个 AWS 账户。所以如果你分裂,你仍然有那个限制。
无论如何,这就是我的做法。
- 改为使用您的 lambda return 一个数组中有 1500 个用户,将其分块为每个分块 50 个用户
- 使用并发为 1 的 Map 状态,输入是分块数组(50 个)
"${JenkinsUsersFunctionArn}"
期望 return 这个
{
"users": [
[
50 users...
],
[
50 users...
],
...
[
15 users...
]
]
}
这是您的地图状态
Filter Jenkins Users:
Type: Map
InputPath: "$.users"
MaxConcurrency: 1
Iterator:
StartAt: Filter
States:
Filter:
Type: Task
Resource: arn:aws:states:::states:startExecution
Parameters:
StateMachineArn:
Input:
Users: "$"
AWS_STEP_FUNCTIONS_STARTED_BY_EXECUTION_ID.$: "$$.Execution.Id"
End: true
ResultPath: "$.users"
Next: Success State