具有动态步骤的 AWS Step Functions
AWS Step Functions with dynamic steps
我正在探索 AWS 步骤函数,但是,我无法找到我的用例所需问题的答案。假设我们可以在整个系统中完成 10 个任务。有时我们必须按顺序执行任务 1、3,有时是 4、8,而有时是 1、9、5。
要执行的任务以及它们必须执行的顺序由进入系统的 json 数据决定。
我想知道我是否可以根据出现的需求以某种方式动态创建步骤函数。
如果一切都是动态的,您必须发挥一些创意才能在 Step Functions 中对流程进行建模。
一种方法可能是构建一个状态机,其中包含您的所有任务和一个编排 decider
函数。 SM 将从 decider
开始,然后根据其输出执行正确的作业。每个作业将依次再次调用 decider
。如果它确定该过程已完成,则 SM 将成功结束。它可能是这样的:
{
"StartAt": "Decide next",
"States": {
"Decide next": {
"Type": "Task",
"Resource":"arn:aws:lambda:::function:decider",
"ResultPath": "$.nextAction",
"Next": "Choose action"
},
"Choose action": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.nextAction",
"StringEquals": "DONE",
"Next": "Process finished"
},
{
"Variable": "$.nextAction",
"StringEquals": "1",
"Next": "Job 1"
},
{
"Variable": "$.nextAction",
"StringEquals": "2",
"Next": "Job 2"
},
{
"Variable": "$.nextAction",
"StringEquals": "3",
"Next": "Job 3"
}
]
},
"Job 1": {
"Type": "Task",
"Resource":"arn:aws:lambda:::function:job1",
"ResultPath": "$.jobResult",
"Next": "Decide next"
},
"Job 2": {
"Type": "Task",
"Resource":"arn:aws:lambda:::function:job2",
"ResultPath": "$.jobResult",
"Next": "Decide next"
},
"Job 3": {
"Type": "Task",
"Resource":"arn:aws:lambda:::function:job3",
"ResultPath": "$.jobResult",
"Next": "Decide next"
},
"Process finished": {
"Type": "Succeed"
}
}
}
你必须通过执行日志才能通过SM看到进度,你将无法直观地看到它(所有运行的作业都是绿色的,这不会告诉你他们的继任)。
请注意,您始终可以动态创建状态机。 (from here)
package com.example;
import static com.amazonaws.services.stepfunctions.builder.StepFunctionBuilder.*;
import com.amazonaws.services.stepfunctions.builder.ErrorCodes;
public class StepFunctionsDemo {
public static void main(String[] args) {
final StateMachine stateMachine = stateMachine()
.comment("A Hello World example of the Amazon States Language using an AWS Lambda Function")
.startAt("Hello World")
.state("Hello World", taskState()
.resource("arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME")
.transition(end()))
.build();
System.out.println(stateMachine.toPrettyJson());
}
}
我正在探索 AWS 步骤函数,但是,我无法找到我的用例所需问题的答案。假设我们可以在整个系统中完成 10 个任务。有时我们必须按顺序执行任务 1、3,有时是 4、8,而有时是 1、9、5。
要执行的任务以及它们必须执行的顺序由进入系统的 json 数据决定。
我想知道我是否可以根据出现的需求以某种方式动态创建步骤函数。
如果一切都是动态的,您必须发挥一些创意才能在 Step Functions 中对流程进行建模。
一种方法可能是构建一个状态机,其中包含您的所有任务和一个编排 decider
函数。 SM 将从 decider
开始,然后根据其输出执行正确的作业。每个作业将依次再次调用 decider
。如果它确定该过程已完成,则 SM 将成功结束。它可能是这样的:
{
"StartAt": "Decide next",
"States": {
"Decide next": {
"Type": "Task",
"Resource":"arn:aws:lambda:::function:decider",
"ResultPath": "$.nextAction",
"Next": "Choose action"
},
"Choose action": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.nextAction",
"StringEquals": "DONE",
"Next": "Process finished"
},
{
"Variable": "$.nextAction",
"StringEquals": "1",
"Next": "Job 1"
},
{
"Variable": "$.nextAction",
"StringEquals": "2",
"Next": "Job 2"
},
{
"Variable": "$.nextAction",
"StringEquals": "3",
"Next": "Job 3"
}
]
},
"Job 1": {
"Type": "Task",
"Resource":"arn:aws:lambda:::function:job1",
"ResultPath": "$.jobResult",
"Next": "Decide next"
},
"Job 2": {
"Type": "Task",
"Resource":"arn:aws:lambda:::function:job2",
"ResultPath": "$.jobResult",
"Next": "Decide next"
},
"Job 3": {
"Type": "Task",
"Resource":"arn:aws:lambda:::function:job3",
"ResultPath": "$.jobResult",
"Next": "Decide next"
},
"Process finished": {
"Type": "Succeed"
}
}
}
你必须通过执行日志才能通过SM看到进度,你将无法直观地看到它(所有运行的作业都是绿色的,这不会告诉你他们的继任)。
请注意,您始终可以动态创建状态机。 (from here)
package com.example;
import static com.amazonaws.services.stepfunctions.builder.StepFunctionBuilder.*;
import com.amazonaws.services.stepfunctions.builder.ErrorCodes;
public class StepFunctionsDemo {
public static void main(String[] args) {
final StateMachine stateMachine = stateMachine()
.comment("A Hello World example of the Amazon States Language using an AWS Lambda Function")
.startAt("Hello World")
.state("Hello World", taskState()
.resource("arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME")
.transition(end()))
.build();
System.out.println(stateMachine.toPrettyJson());
}
}