在本教程中,您将学习如何使用 AWS Step Functions 和 Amazon SQS 来设计和运行无服务器工作流,以编排基于消息队列的微服务。Step Functions 是一种无服务器编排服务,可让您轻松地将多项 AWS 服务编排为易于调试和更改的灵活工作流。Amazon SQS 是允许应用程序组件在云中通信的一种 AWS 服务。
本教程将模拟在订单处理工作流中,一个电子商务应用程序中传入订单的库存验证请求。Step Functions 会将库存验证请求发送到 SQS 上的队列。AWS Lambda 函数将充当您的库存微服务,该微服务使用队列来缓存请求。检索到请求时,它将检查库存,然后将结果返回给 Step Functions。以这种方式配置 Step Functions 中的任务时,就称为回调模式。回调模式使您可以将异步任务集成到工作流中,例如本教程的库存验证微服务。

a. 打开 AWS 管理控制台,以便使本分步指南处于打开状态。此屏幕加载后,请输入您的用户名和密码以便开始操作。然后,在搜索文本框中输入 SQS 并选择 Simple Queue Service 以打开控制台。
在此步骤中,您将创建和配置一个 Amazon SQS 队列。队列是一种可靠且高度可扩展的缓冲区,用于当消息在分布式应用程序或微服务间传送时存储它们。队列可以帮助解耦应用程序、连接微服务、批量处理任务或存储通知。
在本教程中,我们的 SQS 使用案例将模拟在一个电子商务应用程序中,来自传入订单的库存验证请求的存储。
下一步是设计一个工作流,该工作流描述您希望如何处理电子商务订单。工作流将流程描述为一系列可以不断重复执行的单独任务。
您将在 AWS Step Functions 中设计工作流。您的工作流将通过一项微服务请求验证库存。许多微服务使用队列来接收请求。在本教程中,您将使用 AWS Lambda 函数表示微服务。
a.打开 AWS Step Functions 控制台。选择使用代码片段创作,随后为您的状态机命名为 InventoryStateMachine。
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 } } }
AWS IAM 是一项 Web 服务,可帮助您安全地控制对 AWS 资源的访问。在此步骤中,您将创建一个 IAM 角色,该角色允许 Step Functions 访问 SQS。
a.在另一个浏览器窗口中,打开 AWS 管理控制台。在屏幕加载后,在搜索栏中键入 IAM,然后选择 IAM 以打开服务控制台。
在此步骤中,您将创建一个 Lambda 函数,该函数将模拟一项库存微服务。Lambda 函数从 SQS 检索消息,并将返回一条消息到 Step Functions,该消息代表请求的结果。
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); }); } };
您的无服务器工作流已准备就绪,可以执行了! 一个状态机执行就是您的工作流的一个实例,并且在每次 Step Functions 状态机运行并执行其任务时都会发生。每个 Step Functions 状态机可以同时执行多个操作,您可以从 Step Functions 控制台中启动这些操作(这也是您接下来要做的事情),或者使用 AWS 开发工具包、Step Functions API 操作或 AWS CLI 启动这些操作。执行将接收 JSON 输入并产生 JSON 输出。
在此步骤中,您将终止您的 AWS Step Functions 以及与 AWS Lambda 相关的资源。
重要说明:终止当前未使用的资源可降低成本,是最佳做法。不终止资源可能会产生费用。
您已使用 AWS Step Functions 和 Amazon SQS,在云端使用消息队列编排了一项微服务。在重点考虑工作效率和敏捷性的情况下,如果需要协调应用程序资源,则使用 Step Functions 很合适。
至此,您已经学会了如何编排基于队列的微服务,接下来可以进入下一个教程,学习如何使用 Step Functions 来处理错误。您将创建一个带有“重试”和“捕获”字段的状态机,这些字段根据错误消息类型(一种称为函数错误处理的方法)响应来自模拟 API 的响应代码。