编排基于队列的微服务

级别:中级
持续时间:10 分钟

在本教程中,您将学习如何使用 AWS Step Functions 和 Amazon SQS 来设计和运行无服务器工作流,以编排基于消息队列的微服务。Step Functions 是一种无服务器编排服务,可让您轻松地将多项 AWS 服务编排为易于调试和更改的灵活工作流。Amazon SQS 是允许应用程序组件在云中通信的一种 AWS 服务。

本教程将模拟在订单处理工作流中,一个电子商务应用程序中传入订单的库存验证请求。Step Functions 会将库存验证请求发送到 SQS 上的队列。AWS Lambda 函数将充当您的库存微服务,该微服务使用队列来缓存请求。检索到请求时,它将检查库存,然后将结果返回给 Step Functions。以这种方式配置 Step Functions 中的任务时,就称为回调模式。回调模式使您可以将异步任务集成到工作流中,例如本教程的库存验证微服务。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-diagram

使用此教程需要拥有 AWS 账户

创建免费账户

AWS Step Functions 或 Amazon SQS 不收取任何额外费用。您在本教程中创建的资源符合免费套餐条件。

查看 AWS 免费套餐详细信息 »

a. 打开 AWS 管理控制台,以便使本分步指南处于打开状态。此屏幕加载后,请输入您的用户名和密码以便开始操作。然后,在搜索文本框中输入 SQS 并选择 Simple Queue Service 以打开控制台。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-1a

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-1a

b.如果 SQS 控制台登录页面显示(如屏幕截图所示),请单击“立即开始使用”。如果您没有看到此页面,请跳至下一步。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-1b

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-1b

在此步骤中,您将创建和配置一个 Amazon SQS 队列。队列是一种可靠且高度可扩展的缓冲区,用于当消息在分布式应用程序或微服务间传送时存储它们。队列可以帮助解耦应用程序、连接微服务、批量处理任务或存储通知。
在本教程中,我们的 SQS 使用案例将模拟在一个电子商务应用程序中,来自传入订单的库存验证请求的存储。


a. 首先,我们将创建一个简单队列,用于存储在商店中所下的订单。在队列名称字段中输入 Orders

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2a

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2a

b.在本教程中,我们不需要遵循严格的顺序,因此我们不会对队列类型进行任何更改。使 Standard Queue(标准队列)处于选中状态。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2b

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2b

c. 您可以配置您的队列,以修改保留期、消息大小上限和发送延迟等设置。在本教程中,我们将保留默认参数。选择 Quick-Create Queue(快速创建队列)。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2c

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2c

d. 您的新队列随即会创建并在队列列表中处于选中状态。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2d

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2d

下一步是设计一个工作流,该工作流描述您希望如何处理电子商务订单。工作流将流程描述为一系列可以不断重复执行的单独任务。
您将在 AWS Step Functions 中设计工作流。您的工作流将通过一项微服务请求验证库存。许多微服务使用队列来接收请求。在本教程中,您将使用 AWS Lambda 函数表示微服务。


a.打开 AWS Step Functions 控制台。选择使用代码片段创作,随后为您的状态机命名为 InventoryStateMachine

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3c

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3c

b.将状态机定义窗口的内容替换为下面的 Amazon States Language (ASL) 状态机定义。Amazon States Language 是基于 JSON 的结构化语言,用于定义状态机。

此状态机使用任务状态将消息置入 SQS 队列。此任务状态配置为回调模式。当您将 .waitForTaskToken 附加到资源时,Step Functions 将向 JSON 有效负载添加任务令牌并等待回调。微服务可以通过调用 Step Functions API 将结果返回给 Step Functions。

{
  "Comment": "An example of the Amazon States Language for starting a callback task.",
  "StartAt": "Check Inventory",
  "States": {
    "Check Inventory": {
      "Type": "Task",
      "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",
      "Parameters": {
        "QueueUrl": "<INSERT SQS QUEUE URL HERE>",
        "MessageBody": {
          "MessageTitle": "Callback Task started by Step Functions",
          "TaskToken.$": "$$.Task.Token"
        }
      },
      "Next": "Notify Success",
      "Catch": [
      {
        "ErrorEquals": [ "States.ALL" ],
        "Next": "Notify Failure"
      }
      ]
    },
    "Notify Success": {
      "Type": "Pass",
      "Result": "Callback Task started by Step Functions succeeded",
      "End": true
    },
    "Notify Failure": {
      "Type": "Pass",
      "Result": "Callback Task started by Step Functions failed",
      "End": true
    }
  }
}
tmt-orchestrate-microservices-with-message-queues-on-step-functions-3d

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3d

c.从 SQS 控制台复制 SQS 队列的 URL,然后粘贴到状态机定义中。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3e

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3e

d.单击“刷新”按钮,让 Step Functions 将 ASL 状态机定义转换为可视工作流。通过查看可视工作流,可以轻松验证是否正确描述了流程。在微服务返回结果时,状态机将继续执行下面的成功分支。如果出现问题,您可以捕获异常并进入正确的分支下执行纠正措施。

单击下一步

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3f

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3f

e.接下来向工作流添加 IAM 角色。选择为我创建 IAM 角色,然后命名为 inventory-state-machine-role。Step Functions 将分析您的工作流,然后生成 IAM 策略(包含您的工作流使用的资源)。选择创建状态机。您应看到指示状态机创建成功的绿色横幅。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3g

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3g

AWS IAM 是一项 Web 服务,可帮助您安全地控制对 AWS 资源的访问。在此步骤中,您将创建一个 IAM 角色,该角色允许 Step Functions 访问 SQS。


a.在另一个浏览器窗口中,打开 AWS 管理控制台。在屏幕加载后,在搜索栏中键入 IAM,然后选择 IAM 以打开服务控制台。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4a

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4a

b.单击角色,再单击创建角色

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4b

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4b

c.在创建角色屏幕上,将 AWS 服务保留为选中装填,然后依次选择 Lambda下一步:权限

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4c

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4c

d. 在“创建角色”屏幕上,附加
AmazonSQSFullAccessAWSStepFunctionsFullAccess 策略。 依次选择下一步:标签下一步:查看

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4d

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4d

e.输入角色名称 inventory-lambda-role,并单击创建角色

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4e

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4e

在此步骤中,您将创建一个 Lambda 函数,该函数将模拟一项库存微服务。Lambda 函数从 SQS 检索消息,并将返回一条消息到 Step Functions,该消息代表请求的结果。


a.单击服务,在搜索栏中键入 Lambda,然后选择 Lambda 以打开服务控制台。

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5a

b.选择创建函数

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5b

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5b

c.让从头开始创作保持选中状态。接下来,如下所述配置第一个 Lambda 函数:

对于“名称”,键入 Inventory
对于“运行时”,选择 Node.js 8.10
对于“角色”,选择使用现有角色

从列表中选择 inventory-lambda-role
单击创建函数​。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5c

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5c

d.用以下代码替换“函数代码”窗口的内容,然后单击保存

console.log('Loading function');
          const aws = require('aws-sdk');

          exports.handler = (event, context, callback) => {
              const stepfunctions = new aws.StepFunctions();

              for (const record of event.Records) {
                  const messageBody = JSON.parse(record.body);
                  const taskToken = messageBody.TaskToken;

                  const params = {
                      output: "\"Callback task completed successfully.\"",
                      taskToken: taskToken
                  };

                  console.log(`Calling Step Functions to complete callback task with params ${JSON.stringify(params)}`);

                  stepfunctions.sendTaskSuccess(params, (err, data) => {
                      if (err) {
                          console.error(err.message);
                          callback(err.message);
                          return;
                      }
                      console.log(data);
                      callback(null);
                  });
              }
          };
tmt-orchestrate-microservices-with-message-queues-on-step-functions-5d

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5d

e.选择 SQS 触发器。将 Orders 队列的开关切换为启用。依次单击添加保存

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5e

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5e

您的无服务器工作流已准备就绪,可以执行了! 一个状态机执行就是您的工作流的一个实例,并且在每次 Step Functions 状态机运行并执行其任务时都会发生。每个 Step Functions 状态机可以同时执行多个操作,您可以从 Step Functions 控制台中启动这些操作(这也是您接下来要做的事情),或者使用 AWS 开发工具包、Step Functions API 操作或 AWS CLI 启动这些操作。执行将接收 JSON 输入并产生 JSON 输出。


a.单击服务,在搜索栏中键入 Step,然后选择 Step Functions 以打开服务控制台。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6a

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6a

b.在状态机屏幕上,单击您的 InventoryStateMachine

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6b

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6b

c.单击开始执行

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6c

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6c

d.系统将显示一个新的执行对话框,您可以在其中提供状态机输入。此状态机不依赖于输入。您可以使用默认输入。单击开始执行

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6d

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6d

e.在您的工作流执行时,每个步骤都会在“可视化工作流”窗格中更改颜色。等待几秒钟,待执行完成。然后,在执行详情窗格中,单击输入输出,查看工作流的输入和结果。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6e

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6e

f.Step Functions 允许您检查工作流执行的每个步骤,包括每个状态的输入和输出。单击工作流中的各个任务,展开步骤详情下的输入输出字段。您可以看到,状态机中输入的有效载荷会从各步骤传递到下一步骤,并且有效载荷在每个步骤完成时都会更新。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6f

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6f

g.向下滚动到执行事件历史记录部分。单击执行的每个步骤,以查看 Step Functions 如何调用 SQS 并在步骤之间传递有效载荷。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6g

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6g

h.根据 InventoryStateMachine 的输出,您的工作流可能以成功或失败而告终。
在现实世界中,您可能会决定重试任务或采取其他措施,具体取决于收到的错误消息。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6h

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6h

在此步骤中,您将终止您的 AWS Step Functions 以及与 AWS Lambda 相关的资源。
重要说明:终止当前未使用的资源可降低成本,是最佳做法。不终止资源可能会产生费用。


a.在 AWS Step Functions 控制台窗口顶部,单击状态机

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7a

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7a

b.在“状态机”窗口中,单击 InventoryStateMachine,然后选择删除。在对话框中选择删除状态机以确认操作。Step Functions 确认任何正在进行的执行均已完成后,您的状态机将在一两分钟内被删除。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7b

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7b

c.接下来,您将删除 Lambda 函数。单击 AWS 管理控制台菜单中的服务,然后选择 Lambda

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7c

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7c

d.在函数屏幕中,单击您为本教程创建的 Inventory 函数,然后依次选择操作删除。再次单击删除确认删除。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7d

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7d

e.最后,您将删除 IAM 角色。单击 AWS 管理控制台菜单中的服务,然后选择 IAM

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7e

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7e

f.选择您为本教程创建的两个 IAM 角色,然后单击删除角色。在对话框中单击是,删除以确认删除。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7f

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7f

g.在队列列表中,选择 Orders 队列。然后,从队列操作中,选择删除队列

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7g

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7g

h.删除队列对话框随即显示。您可以删除您的队列,即使队列中仍然有消息也是如此。选择是,删除队列。队列将被删除。

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7h

(单击可缩放)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7h

您已使用 AWS Step Functions 和 Amazon SQS,在云端使用消息队列编排了一项微服务。在重点考虑工作效率和敏捷性的情况下,如果需要协调应用程序资源,则使用 Step Functions 很合适。

至此,您已经学会了如何编排基于队列的微服务,接下来可以进入下一个教程,学习如何使用 Step Functions 来处理错误。您将创建一个带有“重试”和“捕获”字段的状态机,这些字段根据错误消息类型(一种称为函数错误处理的方法)响应来自模拟 API 的响应代码。