亚马逊云科技 Build On - 咖啡厅Demo学习stepfunction serverless应用

news2024/12/25 0:56:07

荣幸参与和csdn和aws联合举办的buildon实验活动,主要目的还是学习stepfucntion的使用,这个服务能够集成大量aws service感觉可以出现很多有趣的用法。官方给出的文档已经非常详细了,这里只是对一些比较难理解的点进行了记录和解释,欢迎交流和学习~

本次实验通过stepfunction创建事件驱动的 serverless 服务,整体架构如下图

在这里插入图片描述

涉及到的服务包括,Amazon Step Functions、Amazon EventBridge、Amazon Lambda、Amazon API Gateway、Amazon S3、Amazon DynamoDB和Amazon Cognito

主要收获

  1. 使用stepfunction创建工作流
  2. Amazon States Language的写法和含义
  3. eventbridge的事件生成捕获和驱动

大部分的资源已经通过cloudformation的方式预置了,属于是常规操作,想要了解cloudformation的更多细节可以看之前的几篇文章。我们只需要围绕一个主要的stepfunction用工即可

Workflow Studio

创建并设计状态机,aws提供了可视化界面来简化工作

         Step Functions 工作流程工作室组件

设计界面预置了很多状态和集成服务。其中状态是状态机中的元素,状态通过其名称 来引用,这可以是任意字符串,但在整个状态机的范围内必须唯一,总共由以下几个

  • Do some work in your state machine (a Task state)
  • Make a choice between branches of execution (a Choice state)
  • Stop an execution with a failure or success (a Fail or Succeed state)
  • Pass its input to its output, or inject some fixed data into the workflow (a Pass state)
  • Provide a delay for a certain amount of time, or until a specified date and time (a Wait state)
  • Begin parallel branches of execution (a Parallel state)
  • Dynamically iterate steps (a Map state)

在这里插入图片描述

最终设计出的stepfunction如下
在这里插入图片描述
整个stepfunction就是将特定输入经过一系列处理按照特定逻辑转化为一系列输出的过程

其中两个回调事件比较特殊,通过指定如下api,经过自定义事件总线发送事件

{
  "Entries": [
    {
      "Detail": {
        "Message": "The order has reached the end of the workflow, and so a final event is emitted to alert other services to this.",
        "userId.$": "$.detail.userId",
        "orderId.$": "$.detail.orderId"
      },
      "DetailType": "OrderProcessor.orderFinished",
      "EventBusName": "Serverlesspresso",
      "Source": "awsserverlessda.serverlesspresso"
    }
  ]
}

相关的ddb表存储数据,共四张表。例如下面这个表记录的店铺信息

在这里插入图片描述

等待具有任务令牌的回调(用于执行一些外部操作),在官方文档中给出了例子,Step Functions 发布了一条 Amazon SQS 消息,其中包含任务令牌作为消息的一部分。外部系统与 Amazon SQS 集成,并将消息从队列中拉出。完成后,它会返回结果和原始任务令牌。然后,Step Functions 继续其工作流程

具体需要发送api调用来恢复stepfunction的执行

aws stepfunctions send-task-success  --task-output '{"orderId":1}' --task-token YOUR_TASK_TOKEN
             SQS 任务等待任务令牌返回

最后的超时设置

官方文档给出的示例如下,任务在 300 秒内未能完成,或者未在 60 秒的间隔内发送检测信号通知,则任务会被标记为 failed

"ActivityState": {
  "Type": "Task",
  "Resource": "arn:aws:states:us-east-1:123456789012:activity:HelloWorld",
  "TimeoutSeconds": 300,
  "HeartbeatSeconds": 60,
  "Next": "NextState"
}

Amazon States Language

Step Functions 工作流程使用 Amazon 状态语言 (ASL) 定义。ASL是一种基于 JSON 的结构化语言,用于定义状态机、工作状态的集合(任务状态)、确定要转换到下一个状态的状态(选择状态)、因错误停止执行(失败状态)、等等。工作流是基于 JSON 的文档,您可以将其签入 GitHub,并使用基础设施作为代码工具(如 Amazon SAM 或 CDK)进行部署。

Payload Template

状态机解释器通过payload template传递不同状态之间的输入输出

If any field within the Payload Template (however deeply nested) has a name ending with the characters “.$”, its value is transformed according to rules below and the field is renamed to strip the suffix

  • If the field value begins with only one “$”, the value MUST be a Path. In this case, the Path is applied to the Payload Template’s input and is the new field value.
  • If the field value begins with “$$”, the first dollar sign is stripped and the remainder MUST be a Path. In this case, the Path is applied to the Context Object and is the new field value.
  • If the field value does not begin with “$”, it MUST be an Intrinsic Function. The interpreter invokes the Intrinsic Function and the result is the new field value.
  • If the path is legal but cannot be applied successfully, the interpreter fails the machine execution with an Error Name of “States.ParameterPathFailure”. If the Intrinsic Function fails during evaluation, the interpreter fails the machine execution with an Error Name of “States.IntrinsicFailure”.
  • A JSON object MUST NOT have duplicate field names after fields ending with the characters “. " a r e r e n a m e d t o s t r i p t h e " . " are renamed to strip the ". "arerenamedtostripthe".” suffix.

例如

"X": {
  "Type": "Task",
  "Resource": "arn:aws:states:us-east-1:123456789012:task:X",
  "Next": "Y",
  "Parameters": {
    "flagged": true,
    "parts": {
      "first.$": "$.vals[0]", // payload参数
      "last3.$": "$.vals[-3:]"
    },
    "weekday.$": "$$.DayOfWeek", //context对象
    "formattedOutput.$": "States.Format('Today is {}', $$.DayOfWeek)" //内部函数
  }
}

Input and Output Processing

Fields named “InputPath”, “Parameters”, “ResultSelector”, “ResultPath”, “OutputPath” 支持对J不同状态之间传递的JSON文本的格式和内容进行控制

aws控制台上提供了data flow simulator的功能帮助我们调试数据流转换,遗憾的是中国区貌似还未提供此功能

在这里插入图片描述

看看每种类型的介绍如下

  • state input:状态机中的每个状态将接收 JSON 作为输入并将 JSON 作为输出传递。可以使用一个或多个提供的状态筛选器减少状态输入
  • inputpath:使用 InputPath 筛选器选择要使用的 JSON 状态输入部分,通过json表达式指定要使用的 JSON 部分
  • parameter:可用来创建作为aws服务输入传递的键值对集合,如 Lambda 函数调用。这些值可以是静态的或者可以使用 JSONPath 表达式
  • task result:来自 AWS 服务集成或活动工作线程的响应
  • ResultSelector:使用 ResultSelector 筛选器以使用任务结果部分构建新的 JSON 对象。
  • ResultPath:使用 ResultPath 将结果添加到原始状态输入中。指定的路径表示结果的添加位置。
  • OutputPath:OutputPath 筛选器允许您在最终结果成为状态输出之前对其进行筛选。
  • State Output:最终输出

不同数据状态之间的转换逻辑如下图

       输入和输出处理

官方的电影数据的转换图示图下,字比较小建议下载放大看

实验中全部的参数输入和输出都是按照States Language的语法来写的,这个图应该有助于理解input/output的转化
在这里插入图片描述

Event-driven

事件驱动架构具有三个关键组件:事件生产者、事件路由器和事件消费者。生产者向路由器发布事件,路由器过滤并将事件推送给消费者。生产者服务和消费者服务是解耦的,这使得它们可以独立扩展、更新和部署。

eventbrdige会按照预先设定的规则对特定的事件进行匹配和捕获(事件种类众多),并触发目标操作

除了aws托管事件外,我们可以自定义事件的发送和处理

该项目实际上在2个地方等待外部事件激活工作流

  1. 等待客户下单(发送令牌回调事件)
  2. 等待商家完成订单(发送令牌回调事件)

实验中为我们提供了OrderManager工作流stepfunction进行发送回调的操作

在这里插入图片描述

在之后就是和前端页面进行端到端集成测试,按照给出的步骤完成就可以了,iot和cognito用户池的配置没有进一步解释有点遗憾。

  • 前端是使用Amazon Amplify部署的 Vue.js 应用程序。
  • 前端应用程序使用 Amazon Cognito 来允许客户注册和登录他们的账户,后端使用相同的 Cognito 配置来识别用户。
  • 前端使用Amazon API Gateway终端节点与关键服务进行通信。
  • 使用与Amazon IoT Core的 WebSocket 连接来接收实时消息

最终实现的效果还是很喜人,本次收获还是蛮大的~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

restricted isometry property 稀疏 (CSDN_0002_20220908)

目录 1. 稀疏问题的引出 2. RIP 说明: 1. 由于参考多篇文献,所以本文的符号与原文略有不同。 2. 由于原文公式较多,所以本文采用了截图的形式,如需要电子版文档,可私信或留言。 1. 稀疏问题的引出 2. RIP 关于1-…

MySQL存储过程高级SQL语句总结

MySQL高级SQL语句(存储过程) 一、存储过程的概述 1.1 什么是存储过程 存储过程是一组为了完成特定功能的SQL语句集合。 存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后…

Quarkus构建一个原生可执行文件

先决条件 大概15分钟 编辑器 安装GraalVM,并正确配置 Apache Maven 3.8.1 可以工作的容器 (Docker或者Podman) 一个 C语言工作开发环境 Quarkus应用程序代码 支持在C语言中进行原生编译 拥有一个C语言工作开发者环境意味着什么? 在Linux上&#xf…

华为手机恢复出厂设置后如何恢复数据

当您恢复出厂设置时,手机上存储的所有数据都会被清空。这是因为恢复出厂设置基本上是您从头开始设置手机的一种方式。 众所周知,重置手机会清除手机上的现有数据。如果这种强制删除让你丢失了重要数据,那么恢复出厂设置后数据还能恢复吗&…

企企通:如何利用数字化之道,赋能汽车行业供应链创新?

汽车是国民经济的支柱性企业,产业链长,涉及面广、带动性强,国际化程度高,在全球主要经济大国的产业体系中一直占据着重要地位。 我国汽车行业通过几十年的高速发展之后,从量变到质变,逐渐向低速增长的模式开…

把TeamTalk(即时通讯项目)中的线程池连接池拆出来单独测试。

研究过Teamtalk的伙伴会发现它的线程池和连接池与很多文件有关联, 这篇文章主要写,把它的线程池连接池拆出来需要用到哪些文件。 其实我本来只想测试它的连接池的,但发现连接池里套的有线程池,于是就一起拆出来了。 整个工程的树…

基于SpringBoot的社区小型图书管理系统的设计与实现

作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云…

有效操作:Ubuntu上已经安装最新node但是node -v返回的版本号确实错的;ubuntu第一次启动vue项目报npm版本错误

** 如已经安装过最新版的node话可直接跳到操作6: 1.查看node版本,没安装的请先安装; node -v 如果安装成功的话会返回版本号: 2.如果nodejs包出错需要重新安装的话,删除不干净会有可能出现问题,下面就介…

应用出海活跃,开发教程

移动应用行业在国内显现出用户增量放缓的趋势,多种类型的应用渗透率也渐趋饱和。随着政策支持力度的加大,越来越多移动应用走向了海外市场,拓宽用户群。 根据艾瑞咨询在《2022年移动应用出海趋势洞察白皮书》中指出,游戏类占出海…

开源项目-CRM客户关系管理系统

哈喽,大家好,今天给大家带来一个开源系统-CRM客户关系管理系统 主要功能包括客户管理,客户流失,销售机会,客户关怀等模块 系统开发环境以及版本 操作系统: Windows_7集成开发工具: Eclipse EE_…

Zabbix技术分享——snmp异常排查指南

大家好,我是乐乐。在IT运维中,难免会碰上设备snmp不通的情况,那么,当问题出现的时候,运维工程师该如何快速找到问题所在呢?下面让我们一起来看看吧! 1.IP配置检查 首先检查zabbix监…

蓝牙模块芯片型号有哪些?国产还是进口?核心指标有哪些

目录 一、蓝牙模块的简介 先看看百度百科对“蓝牙模块”的定义蓝牙模块,是一种集成蓝牙功能的PCBA板,用于短距离无线通讯,按功能分为蓝牙数据模块和蓝牙语音模块。蓝牙模块是指集成蓝牙功能的芯片基本电路集合,用于无线网络通讯&…

UTONMOS链游将为GameFi游戏玩家带来更多的可能

2022年,全球新型冠状病毒疫情尚未彻底消弭,尽管少数国家的隔离措施和防疫规定已开始逐渐放宽,我国也已在疫情防控上估到彻底放开,但人们的生活却远未恢复“常态”。 近3年来,世界各国实施的防疫隔离和封城措施&#x…

Hive+Spark离线数仓工业项目实战--数仓设计及数据采集(2)

MR的Uber模式 目标:了解MR的Uber模式的配置及应用 实施 - Spark为什么要比MR要快 - MR慢 - 只有Map和Reduce阶段,每个阶段的结果都必须写入磁盘 - 如果要实现Map1 -> Map2 -> Reduce1 -> Reduce2 - Mapreduce1:Map…

完全可移植c2000控制器工程模板创建

完全可移植c2000控制器工程模板创建前言步骤创建工程库函数支撑文件拷贝寄存器支撑文件拷贝参考博文及资料前言 迄今为止只学过TI的两款c2000控制器TMS320F280049C和28335,并且所有代码编写都是通过写寄存器来实现的。相较于直接使用TI编写好的库函数,写…

Node.js--》Node环境及nvm版本管理安装及使用

目录 初识Node.js Node.js环境安装 nvm的安装 Node.js环境执行JS代码 初识Node.js Node.js是一个开源、跨平台的 JavaScript 运行时环境。其中文的官方网址为:Node.js官方网址 注意:浏览器是JavaScript的前端运行环境;Node.js是JavaScri…

OpManager 实时网络监控

网络是全球企业背后的基础。它在为您的员工提供行政服务以及为各大洲的客户提供服务方面发挥着关键作用。网络可帮助您将信息保存在一个集中位置 - 需要和限制所有其他入站请求的人员可以访问。那么,您如何提供持续的一流最终用户体验并维护快速发展的网络呢&#x…

JS面试题--ES6知识大全

ES6知识 字面量增强的写法的三种写法 ES6中对 对象字面量 进行了增强,称之为 Enhanced object literals(增强对象字面量)。 字面量的增强主要包括下面几部分: 属性的简写:Property Shorthand方法的简写&#xff1a…

测开工具:二次开发junit接口自动化框架

一:背景 源码地址:GitHub - 18713341733/AutoApi Java 接口自动化框架,一般就是junit与testng。这里我们讲一下junit接口自动化框架的二次开发。 1.1 我们实现了哪些功能 1、自定义了一些注解,用来管理case。包括case的描述、…

如何使用depcheck检查依赖?

目录 1. 你是否遇到过以下问题: 2. 原因 3. 解决 4. depcheck的其他功能 5.需要说明可能存在的问题 总结 1. 你是否遇到过以下问题: 1. GitHub上面克隆的项目,运行报错… 2.去一家新公司,用新电脑运行项目各种报错… 3.明…