Step Functions 不死。第 2 部分:ASL 语言
你好!

哇,我差点没到发帖的第二周。
在第二篇文章中,我们将看到以下主题:
-
什么是 ASL?
-
种状态类型
-
错误处理
-
无服务器
什么是 ASL?
当我们谈论 AWS 上的 ASL 时,我们指的是Amazon States Language。
它是一种基于 JSON 格式的结构化语言,用于定义状态机,毕竟它是任务的集合。这些任务可以执行任务(任务状态),确定下一个状态(选择状态),停止执行错误(失败状态)等等。
状态机和 ASL
asl 中的协调状态机示例如下:
{
"Comment": "A Hello World example demonstrating various state types of the Amazon States Language",
"StartAt": "Pass",
"States": {
"Pass": {
"Comment": "A Pass state passes its input to its output, without performing work. Pass states are useful when constructing and debugging state machines.",
"Type": "Pass",
"Next": "Hello World example?"
},
"Hello World example?": {
"Comment": "A Choice state adds branching logic to a state machine. Choice rules can implement 16 different comparison operators, and can be combined using And, Or, and Not",
"Type": "Choice",
"Choices": [
{
"Variable": "$.IsHelloWorldExample",
"BooleanEquals": true,
"Next": "Yes"
},
{
"Variable": "$.IsHelloWorldExample",
"BooleanEquals": false,
"Next": "No"
}
],
"Default": "Yes"
},
"Yes": {
"Type": "Pass",
"Next": "Hello World"
},
"No": {
"Type": "Fail",
"Cause": "Not Hello World"
},
"Hello World": {
"Type": "Pass",
"End": true
}
}
}
进入全屏模式 退出全屏模式
在状态机结构中,我们有以下字段:
-
注释(可选):这是我们编写任务或状态机描述的地方。
-
StartAt(必填):表示与启动状态机的任务完全匹配的字符串格式的名称(为
Case Sensitive) -
TimeoutSeconds(可选):表示机器执行可以持续的最大秒数。
-
个状态(必需):包含构成状态机的一组任务。
状态类型
在使用状态机时,我们共有 8 种状态可以在编排时帮助我们。
任务
Task 类型的 State 表示由状态机执行的单个工作单元。
任务使用 AWS Lambda 函数或活动执行工作,或者通过传递参数来使用来自其他服务的 API。
"ActivityState": {
"Type": "Task",
"Resource": "arn:aws:states:us-east-1:123456789012:activity:HelloWorld",
"Next": "NextState"
}
进入全屏模式 退出全屏模式
必填字段是;
-
类型:在这种情况下,我们讨论的是任务类型。
-
资源:唯一标识要执行的特定任务的 ARN。
-
下一个或结束:下一个字段指示当前任务执行完成后将运行哪个任务。如果我们希望流程在此任务中结束,我们将用
“End” : true替换它
通过
这种状态从输入中获取信息并将其作为输出传递,而不做任何工作或活动。
也就是说,只是传递信息。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--fkLfihdZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs. twimg.com/media/ExW8UWvXEAUF2o9%3Fformat%3Djpg%26name%3Dsmall)
好吧,现在认真...
这是 Pass 类型的 State 示例。
"No-op": {
"Type": "Pass",
"Result": {
"x-datum": 0.381018,
"y-datum": 622.2269926397355
},
"ResultPath": "$.coords",
"Next": "End"
}
进入全屏模式 退出全屏模式
在这种类型的状态下,必填字段为 Type 和 Next 或 End。
可选的是
-
结果:它是传递给下一个任务的数据,如果有
ResulthPath,它是它在结果中的位置。 -
ResultPath:指定 Result 中指定的虚拟任务的“输出”放置的位置(在输入上)。
也就是说,如果输入是
{
"georefOf": "Home"
}
进入全屏模式 退出全屏模式
将Result与ResulthPath组合的输出为
{
"georefOf": "Home",
"coords": {
"x-datum": 0.381018,
"y-datum": 622.2269926397355
}
}
进入全屏模式 退出全屏模式
等待
此状态一直等到分配的时间,然后继续执行下一个任务。
"wait_ten_seconds": {
"Type": "Wait",
"Seconds": 10,
"Next": "NextState"
}
进入全屏模式 退出全屏模式
分配的时间可以是秒,在字段Seconds中声明,也可以是绝对时间,在字段Timestamp中声明日期。
"Timestamp": "2016-03-14T01:59:00Z"
进入全屏模式 退出全屏模式
选择
它是将分支逻辑添加到状态机的一种。
"ChoiceState": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.name",
"StringEquals": "Blancanieves",
"Next": "Eat Apple"
}
],
"Default": "Not Eat Apple"
}
进入全屏模式 退出全屏模式
必填字段是类型和选项。
在Choices中,状态机可以有不同的分支。
比较运算符有多种类型,它们的名称非常具有描述性。
-
和
-
BooleanEquals,BooleanEqualsPath
-
IsBoolean
-
为空
-
IsNumeric
-
存在
-
字符串
-
是时间戳
-
不是
-
NumericEquals,NumericEqualsPath
-
NumericGreaterThan,NumericGreaterThanPath
-
NumericGreaterThanEquals,NumericGreaterThanEqualsPath
-
NumericLessThan,NumericLessThanPath
-
NumericLessThanEquals,NumericLessThanEqualsPath
-
或
-
StringEquals,StringEqualsPath
-
StringGreaterThan,StringGreaterThanPath
-
StringGreaterThanEquals,StringGreaterThanEqualsPath
-
StringLessThan,StringLessThanPath
-
StringLessThanEquals,StringLessThanEqualsPath
-
字符串匹配
-
时间戳等于,时间戳等于路径
-
TimestampGreaterThan,TimestampGreaterThanPath
-
TimestampGreaterThanEquals,TimestampGreaterThanEqualsPath
-
时间戳LessThan,TimestampLessThanPath
-
时间戳LessThanEquals,TimestampLessThanEqualsPath
建议 Task Choice 有一个名为Default的字段,这样如果它不匹配任何选项,流程可以继续。
并联
Parallel 类型的状态允许您并行执行任务。
{
"LookupCustomerInfo": {
"Type": "Parallel",
"End": true,
"Branches": [
{
"StartAt": "LookupAddress",
"States": {
"LookupAddress": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:AddressFinder",
"End": true
}
}
},
{
"StartAt": "LookupPhone",
"States": {
"LookupPhone": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:PhoneFinder",
"End": true
}
}
}
]
}
}
进入全屏模式 退出全屏模式
必填字段是类型、下一个或结束和分支。
字段Branches是要并行执行的流程,并遵循状态机的语法。
成功
它是用于成功完成执行的任务。它是一种不需要 Next 或 End 字段的状态。
"SuccessState": {
"Type": "Succeed"
}
进入全屏模式 退出全屏模式
失败
以失败的执行终止状态机的执行。
此状态也不需要 Next 或 End 字段。
"FailState": {
"Type": "Fail",
"Cause": "Invalid response.",
"Error": "ErrorA"
}
进入全屏模式 退出全屏模式
字段Cause和Error是可选的。
地图
它是允许对元素的每次迭代执行多个步骤的状态。
也就是说,虽然Parallel同时运行不同的流,但Map为不同的项目运行相同的流。
"Validate-All": {
"Type": "Map",
"Iterator": {
"StartAt": "Validate",
"States": {
"Validate": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:ship-val",
"End": true
}
}
},
"End": true
}
进入全屏模式 退出全屏模式
必填字段为 Type 和Iterator,在此字段中定义了将处理数据的状态机。
错误处理
对于错误处理,我们有两个可以在状态中使用的字段。
-
Retry :它会处理一个状态的重试次数,以防它失败。它只允许在
Task和Parallel类型的状态中。 -
Catch:负责捕获错误并将其重定向到相应的流。它只允许在
Task、Map和Parallel类型的状态中使用。
示例
假设我们有一个 Task 类型的状态,我们需要它
-
如果执行失败,必须进行 3 次尝试。
-
当第三次执行失败时,我们要处理错误以将其发送到特定线程。
"ValidateCreditCard": {
"Type": "Task",
"Resource": "arn:aws:states:us-east-1:123456789012:function:Validate",
"Retry": [
{
"ErrorEquals": [
"States.ALL"
],
"MaxAttempts": 3
}
],
"Catch": [
{
"ErrorEquals": [
"Error"
],
"Next": "Format Error Response",
}
],
"Next": "NextState"
}
进入全屏模式 退出全屏模式
对于重试,我们有Retry字段,其中还有另外两个重要字段。
-
ErrorEquals: 重试的条件,即只有当错误与提到的错误匹配时,我们才会重试。
-
MaxAttempts:是我们执行的尝试次数。
"Retry": [
{
"ErrorEquals": [
"States.ALL"
],
"MaxAttempts": 3
}
]
进入全屏模式 退出全屏模式
对于错误处理,我们将使用字段Catch,它具有以下字段。
-
ErrorEquals:这将是我们想要捕获的错误
-
如果与错误匹配,下一步是下一步的名称。
"Catch": [
{
"ErrorEquals": [
"Error"
],
"Next": "Format Error Response",
}
],
进入全屏模式 退出全屏模式
Catch和Retry字段都是对象数组,可以处理不同类型的错误。
无服务器
什么是serverless?它是一种执行模型,其中云提供商(AWS、Google 或 Azure)负责通过动态分配资源来执行一段代码。并且只对用于执行代码的资源量收费。
使用此模型时,我们可以使用不同的框架。其中之一是SAM(无服务器应用程序模型),它是为无服务器架构创建的开源框架。它是 AWS 框架。
我们将在本系列中用于创建状态机的框架将是Serverless Framework,这也是一个开源框架,它是第一个为此类架构创建的并且使用最多的框架。
型号serverless通常也称为FaaS(功能即服务)。
对于它的安装,我们需要...
1 - 安装 NodeJ。 (安装 NodeJshttps://nodejs.org/en/)
2 - 在控制台中运行此命令(Docu 安装:https://www.serverless.com/framework/docs/getting-started)
npm install -g serverless
进入全屏模式 退出全屏模式
我建议在第四章安装这个。
翅片
这是另一个有理论材料的章节。
在下一篇中,我们将研究一些我们需要了解的 AWS 服务,以便能够继续创建状态机。
为此,如果您还没有账户,我需要您在AWS创建一个账户。
[
](https://res.cloudinary.com/practicaldev/image/fetch/s--OXO-gyY6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https: / /i.ytimg.com/vi/ONNTDstfzsg/mqdefault.jpg)
如果内容为您服务,请不要忘记您可以邀请我喝咖啡。
下周见。
更多推荐



所有评论(0)