## 视频
<video src="https://dev-media.amazoncloud.cn/30-LibaiGenerate/31-LiBaiRebrandingVideo/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures-LBrebrandingWCaptionCN.mp4" class="bytemdVideo" controls="controls"></video>
## 导读
Serverlesspresso 是一种事件驱动的 Serverless 工作负载,它使用 [Amazon EventBridge](https://aws.amazon.com/cn/eventbridge/?trk=cndc-detail) 和 Amazon Step Functions,协调微服务中的事件,并支持每天数千个订单。本论坛探讨了在构建此应用程序时所做的设计决策,新功能如何影响开发过程,以及使用此方法创建生产就绪应用程序时吸取的教训。探索有用的可扩展性模式和选项,这些模式和选项有助于设计健壮、可扩展的解决方案,该解决方案每天的运行成本约为一美元。本论坛包括可以应用于 Serverless 应用程序的示例,以及大型应用程序的复杂体系结构挑战。
## 演讲精华
<font color = "grey">以下是小编为您整理的本次演讲的精华,共1200字,阅读时间大约是6分钟。如果您想进一步了解演讲内容或者观看演讲全文,请观看演讲完整视频或者下面的演讲原文。</font>
[Amazon API Gateway](https://aws.amazon.com/cn/api-gateway/?trk=cndc-detail)支持前端应用程序与后端服务间的沟通,为微服务提供了RESTful API。
- 作为亚马逊云科技的Amplify Console,其使用诸如Vue.js等JavaScript框架来部署和托管三个前端应用。通过基于Git的工作流程,它简化了构建和部署的过程。
- 借助[Amazon Cognito](https://aws.amazon.com/cn/cognito/?trk=cndc-detail),面向客户的应用程序实现了用户身份验证以确保安全性。用户可通过输入其手机号码进行注册。
在接收订单前,需确认商店状态,包括检查咖啡师的容量情况。客户的订单等待时间限制为5分钟,以便生成具有高可读性的订单号(目前最多80,000个)。咖啡师的操作时间限制为15分钟,同时需要处理已取消的订单。
起初,Lambda函数负责处理诸如容量检查等自定义逻辑。核心的工作流程由右侧的Step Functions完成,它会消费并发射相关事件。左侧的未定义微服务则负责协助工作流程的运行。在完成准备工作后,下一个挑战是通过QR码启动订单。团队开发了一个能生成并验证动态二维码的QR服务,一旦成功扫描,将触发工作流程的事件发射。订购和展示应用为工作流程提供了初步的测试方法。
QR服务依赖于API Gateway和Lambda来实现其主要功能。它创建了一个DynamoDB表,其中包含每5分钟过期的五位随机代码,每个代码允许10次扫描。验证功能会检查扫描结果是否与当前活跃的代码相匹配。
这种方法通过在高峰期降低扫描速度来保护下游系统免受高需求的影响。团队发现他们可以实时动态更新菜单,方法是直接编辑后端DynamoDB表。当表发生更改时,事件会通知所有前端进行刷新,展示出事件驱动架构的优势。
接下来的挑战是让客户和咖啡师能够与正在进行的订单互动。他们需要查看、更新和取消订单,而应用程序需要开放订单状态。考虑的选项包括:
- 轮询API以获取订单状态
- 发送SMS更新
- 利用API网关的websockets
最终的解决方案是创建一个满足这些需求的订单管理微服务。它为前端提供REST API,并监听存储在DynamoDB中的任务令牌事件。这实现了对打开订单的快速查询,并为管理员应用程序提供支持。整合订单管理减少了跨lambda的重复。
随着订单的进行,实时更新前端应用程序成为一个障碍。需要双向通信来同步状态,响应商店的开张/关闭,并提供响应式的用户体验。轮询API或SMS通知等选项无法提供所需的实时推送更新。尽管Websockets具有潜力,但直接实现它们被证明具有挑战性。
优雅的解决方案是使用Amazon IoT Core,James将其比喻为“亚马逊云科技的Websockets”。它使用MQTT主题来处理Websocket管理的复杂性。后台服务发布事件,前端订阅更新。这使得将消息轻松发送给大量订阅者变得容易。即使应用程序断开连接,IoT Core的重试逻辑确保最终传递。
实施过程使用了将EventBridge事件路由到IoT Core主题的发布者微服务。前端应用程序的VueJS订阅消耗更新,并通过更新本地数据模型来自动刷新用户界面。 James描述了整个端到端流程,展示了各个组件是如何相互作用的:
- 前端调用REST API并接受实时Websocket通知
- 微服务将事件发布到中央EventBridge总线
- Step Functions工作流协调订单处理
- 发布者服务将来自总线的更新分发到前端
在回顾关键经验教训时,詹姆斯强调了精心设计的活动的重要性,并考虑了胖事件和瘦事件之间的适度包含。他建议引入版本控制以确保生产者与消费者之间的兼容性。为了增加可见性,使用诸如Schema Registry之类的工具来跨不同、相互独立的团队映射事件。通过使用真实事件进行注入而非依赖API进行测试,实现了有价值的验证。借助EventBridge的存档和重放功能,可在改进过程中重现生产环境。
詹姆斯对比了微服务之间的事件驱动通信与服务内部协调。他指出,通过为每个微服务分配单独的栈的方式来打破单体部署,从而加速了开发过程。其他见解还包括运用CQRS和发布/订阅模式来构建可扩展、具有弹性的系统。最大优势在于事件驱动架构所带来的意外可扩展性——可以在不进行侵入性更改的情况下添加新功能。
詹姆斯自豪地总结道,他们已经成功交付了一个高度复杂且实用的应用程序,每天仅需花费约1美元。[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)Espresso成为了一个引人注目的案例研究,展示了如何通过精心策划地利用亚马逊云科技的[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)服务来构建可扩展且经济实惠的应用程序。
最后,詹姆斯为观众提供了一系列资源,以便他们能够继续探索现实生活中的[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)开发。通过有条不紊地经历这个过程,詹姆斯传授了关于如何在亚马逊云科技中采用事件驱动架构的一手宝贵经验。
**下面是一些演讲现场的精彩瞬间:**
詹姆斯·贝克(James Bek)担任亚马逊云科技开发者倡导团队的负责人,他拥有软件工程师、产品管理和构建大规模[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)应用程序的丰富经验。
![](https://d1trpeugzwbig5.cloudfront.net/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures/images/rebranded/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures_0.png)
为了减轻下游系统的压力,QR服务被设计成通过计算扫描次数并在需要时移除条形码。
![](https://d1trpeugzwbig5.cloudfront.net/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures/images/rebranded/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures_1.png)
将API网关和DynamoDB直接集成可以避免使用lambda函数,从而为高容量微服务带来更大的规模和提高响应速度。
![](https://d1trpeugzwbig5.cloudfront.net/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures/images/rebranded/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures_2.png)
Bek强调了一个复杂的微服务如何通过重构简化成一个由一个Lambda函数驱动的Step Functions工作流。
![](https://d1trpeugzwbig5.cloudfront.net/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures/images/rebranded/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures_3.png)
在项目中预留一些额外功能空间可以帮助团队在将来更容易地添加新功能。
![](https://d1trpeugzwbig5.cloudfront.net/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures/images/rebranded/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures_4.png)
通过使用事件驱动的方式进行微服务通信并结合编排与编舞技巧,可以实现卓越的可扩展性和成本节约。
![](https://d1trpeugzwbig5.cloudfront.net/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures/images/rebranded/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures_5.png)
负责人还强调了技能构建器、快速入门指南和数字徽章等学习资源,帮助开发者掌握如何在亚马逊云科技上构建[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)解决方案。
![](https://d1trpeugzwbig5.cloudfront.net/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures/images/rebranded/SVS204-Building_Serverlesspresso__Creating_event_driven_architectures_6.png)
## 总结
1. “[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)Espresso”的设计目标是实现最少的代码量、可扩展性、可伸缩性和成本效益。团队首先在白板上规划需求,编写伪代码,并使用亚马逊云科技(Amazon Web Services)的Step Functions将系统建模为状态机工作流程,以协调订单处理和处理超时等事件。
2. 微服务之间通过事件总线而非私有API进行通信。一个订单管理微服务会监听工作流程事件并存储任务令牌。实时前端则通过IoT Core进行更新,采用可扩展的发布/订阅架构。API Gateway和Step Functions工作流程减少了微服务中的代码重复。
3. 团队从项目中吸取的经验教训包括定义清晰的事件模式、保持事件的不可变性、记录事件以及在开发过程中记录所有事件。其他建议还包括使用EventBridge进行测试存档和重放,以及拆分大型[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)部署。
4. 实用的模式包括使用CQRS进行websocket通信,使用IoT Core进行全局和用户特定主题,适当组合编排和协调,以及在工作流程中管理等待状态。演讲最终以一项成本分析作为结论,表明“[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)Espresso”具有很高的成本效益。
## 演讲原文
## 想了解更多精彩完整内容吗?立即访问re:Invent 官网中文网站!
[2023亚马逊云科技re:Invent全球大会 - 官方网站](https://webinar.amazoncloud.cn/reInvent2023/?s=8739&smid=19458 "2023亚马逊云科技re:Invent全球大会 - 官方网站")
[点击此处](https://aws.amazon.com/cn/new/?trk=6dd7cc20-6afa-4abf-9359-2d6976ff9600&trk=cndc-detail "点击此处"),一键获取亚马逊云科技全球最新产品/服务资讯!
[点击此处](https://www.amazonaws.cn/new/?trk=2ab098aa-0793-48b1-85e6-a9d261bd8cd4&trk=cndc-detail "点击此处"),一键获取亚马逊云科技中国区最新产品/服务资讯!
## 即刻注册亚马逊云科技账户,开启云端之旅!
[【免费】亚马逊云科技“100 余种核心云服务产品免费试用”](https://aws.amazon.com/cn/campaigns/freecenter/?trk=f079813d-3a13-4a50-b67b-e31d930f36a4&sc_channel=el&trk=cndc-detail "【免费】亚马逊云科技“100 余种核心云服务产品免费试用“")
[【免费】亚马逊云科技中国区“40 余种核心云服务产品免费试用”](https://www.amazonaws.cn/campaign/CloudService/?trk=2cdb6245-f491-42bc-b931-c1693fe92be1&sc_channel=el&trk=cndc-detail "【免费】亚马逊云科技中国区“40 余种核心云服务产品免费试用“")