你好!

Gif 帕特里克打招呼

哇,我差点没到发帖的第二周。

在第二篇文章中,我们将看到以下主题:

  • 什么是 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替换它

通过

这种状态从输入中获取信息并将其作为输出传递,而不做任何工作或活动。

也就是说,只是传递信息。

[Wink Wink Chief Gorgory](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"
}

进入全屏模式 退出全屏模式

ResultResulthPath组合的输出为

{
  "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"
}

进入全屏模式 退出全屏模式

字段CauseError是可选的。

地图

它是允许对元素的每次迭代执行多个步骤的状态。

也就是说,虽然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 :它会处理一个状态的重试次数,以防它失败。它只允许在TaskParallel类型的状态中。

  • Catch:负责捕获错误并将其重定向到相应的流。它只允许在TaskMapParallel类型的状态中使用。

示例

假设我们有一个 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",
    }
],

进入全屏模式 退出全屏模式

CatchRetry字段都是对象数组,可以处理不同类型的错误。

无服务器

什么是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创建一个账户。

[酷的事情来了 meme](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)

如果内容为您服务,请不要忘记您可以邀请我喝咖啡。

在 cafecito.app 给我买杯咖啡

下周见。

Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐