CDK 模式 20 周年!让我们一起探索 AWS 的 20 个无服务器模式

2025-05-25

CDK 模式 20 周年!让我们一起探索 AWS 的 20 个无服务器模式

cdkpatterns.com上现在有 20 种完全可部署的无服务器架构模式,全部使用 AWS CDK TypeScript/Python 构建,并且全部包含原始 CloudFormation 模板。

现在似乎是时候停下来反思一下,在一篇文章中展示每个模式的用例。我将按字母顺序简单介绍它们,但如果您想按使用的 AWS 组件查看它们,可以使用组件过滤器;如果您想按它们相关的 AWS Well Architected 支柱查看它们,可以使用Well Architected 模式匹配器。

对于 Jeremy Dalys 的新无服务器参考架构集合中存在的模式,我还将为 AWS CDK 以外的其他框架(SAM、Serverless、Pulumi 等)的用户提供一个链接。

 波莉

波莉拱门

cdk 模式链接

此模式将 Amazon Polly 服务集成到 AWS Lambda 函数中,以便您可以使用无服务器堆栈将文本合成语音。它还与 Amazon Translate 集成,允许您选择语音文本的语言。

何时使用

如果您正在发布内容,您可以使用它来支持使用母语的国际读者/听众

替代方案

我确信存在外部供应商,这是我所知道的唯一的无服务器 AWS 原生解决方案。


S3部署

s3部署arch

这是一个简单的模式,用于将使用 Angular 或 React 构建的网站部署到 S3 存储桶,从而提供超低成本且可扩展的托管解决方案。该模式附带的构造非常灵活,允许您通过添加 CloudFront、自定义域名和 SSL 来扩展捆绑模式。

解构 S3 部署

何时使用

您需要通过 CDK 在 AWS 上部署网站

替代方案

AWS Amplify


超级粉丝

大风扇架构

cdk 模式链接

这是 Heitor Lessa 提出的一种模式,它允许你将消息分发给多个不同的消费者。其妙处在于,你可以根据消息的属性进行过滤,这样消费者只会收到与自己相关的消息,从而节省计算时间/成本。

Heitor Lessa 在 re:Invent

re:Invent 幻灯片

何时使用

如果您正在构建一个异步事件驱动流,需要根据不同的消息类型向多个消费者分发

 替代方案

Amazon EventBridge - 查看 EventBridge ATM


CloudWatch 仪表板

CloudWatch 仪表板

cdk 模式链接

当你开始构建无服务器应用程序时,与传统应用程序相比,感觉缺少的一大块就是可观察性。所有这些小部件都是异步运行的,一旦出现问题,你可能会觉得日志是你唯一的朋友。本模式展示了如何为包含 API Gateway HTTP API、Lambda 和 DynamoDB 的无服务器堆栈生成构建自定义仪表板所需的指标,并添加向 SNS 发布警报的功能。

何时使用

任何构建生产无服务器应用程序的人都应该使用 CloudWatch 仪表板和警报来了解其应用程序状态

 替代方案

您可以使用其他第三方工具,但这是唯一的 AWS 选项


命中注定的 Lambda

注定的 lambda 拱门

cdk 模式链接

此模式将Lambda 目标Amazon EventBridge相结合,向您展示使用 EventBridge 规则,您可以在事件驱动架构中解耦组件,并且通过将其与 lambda 目标相结合,您可以从 lambda 函数本身中剥离 EventBridge 特定的代码并进一步解耦。

解构注定的 Lambda

何时使用

Lambda 目标是从您的编排逻辑中删除样板的绝佳方式,但它们仅在异步执行时才有效,因此如果您的流程是同步的,那么这不适合您。

它们还转发事件的完整上下文,这意味着当您通过目的地将错误发送到死信队列时,您将获得所有内容,包括导致错误的事件,因此您拥有实现自动重试或错误医院功能所需的一切。

 替代方案

如果您不想使用目的地,您仍然可以使用 Amazon EventBridge,只需在 Lambda 函数中添加更多逻辑,或者您可以使用AWS Step Functions


发电机流光

发电机彩带拱门

cdk 模式链接

这是Eric Johnson创建的简单 Web 服务模式的一个变体,只不过 Lambda 表达式没有连接到 API 网关,而是直接连接到 Dynamodb,API 网关使用模板转换传入的消息以插入数据。Lambda 表达式会监听来自 Dynamodb 流的事件,并可用于在插入后进行数据转换,这意味着即使发生错误,也不会丢失任何数据。

在考虑无服务器架构时,请考虑在数据保存之后可以进行多少处理。异步思考可以提高弹性,并且通常可以减少代码量。

何时使用

我会尽可能使用 API 网关与 DynamoDB 的直接集成。遗憾的是,您目前还无法将 VTL 与新的 HTTP API 结合使用,因此需要使用更昂贵的 REST API。不过,从流程中移除 Lambda 函数可以降低延迟和执行成本。如果您的用例存在冷启动问题,那么这可以将冷启动从流程中移除。

 替代方案

简单的 Web 服务模式


EFS Lambda

efs lambda 拱门

cdk 模式链接

这是Danilo Poccia提出的一种模式,它将 EFS 文件系统附加到 Lambda 函数,为其提供可扩展的持久存储。在 Lambda 函数中拥有这种级别的存储开启了许多新的可能性(多个函数甚至可以使用相同的文件系统)。

何时使用

如果你需要在多个 Lambda 函数之间共享状态,或者你需要 Lambda 能够访问大于内存允许最大值的内容

 替代方案

从使用 Lambda 函数转换为使用AWS Fargate容器,您可以一路转到EC2


EventBridge ATM

eventbridge atm 拱门

cdk 模式链接

这是James Beswick博客文章用于部署代码的示例 CDK 堆栈

在此示例中,一个用于自动柜员机 (ATM) 的银行应用程序生成有关交易的事件。它将事件发送到 EventBridge,然后 EventBridge 使用应用程序定义的规则进行相应的路由。有三个下游服务正在使用这些事件的子集。

何时使用

如果你需要构建一个异步流,其中消息的内容决定哪些消费者应该接收消息

 替代方案

您可以将“大粉丝”模式与 SNS 结合使用


EventBridge 断路器

EventBridge 断路器拱门

cdk 模式链接

这是一个 CDK 堆栈示例,用于部署我自己对Jeremy Daly在本文中描述的断路器堆栈以及Martin Fowler早在 2014 年在此处描述的断路器堆栈的解释

在这个例子中,我们在 API 网关后面有一个 Lambda,该网关应该与外部 Web 服务 ( www.google.com ) 集成。问题是,Google 宕机了,你的 Lambda 需要 10 秒才能返回该错误。Lambda 的执行时间是每毫秒都要付费,所以如果有大量用户访问你的服务,情况就很糟糕了。

别担心,我们已经在这个系统中集成了断路器。当对 Google 的调用失败时,错误事件会被推送到 EventBridge,然后路由到 Lambda,该 Lambda 会将一条记录插入 DynamoDB,有效期为 60 秒。

当消费者调用我们的 lambda 函数时,我们会检查过去 60 秒内是否发生了 3 次失败事件,如果是,则立即失败,这可以节省超过 9 秒的执行成本。随着错误事件在 60 秒后过期,我们的失败事件数量应该会逐渐下降到 3 次以下,届时我们会再次调用服务并检查状态。

何时使用

如果您与外部 Web 服务集成,则可能应该集成一个断路器,以便在服务中断时您的系统更具弹性

 替代方案

AWS ElastiCache 可用于缓存成功的调用/响应,但如果您之前没有调用过并且服务已关闭,这将无济于事。


EventBridge ETL

EventBridge ETL 架构

cdk 模式链接

这是一个示例堆栈,展示了如何使用 EventBridge 通过 ETL 流程编排事件。此模式由Vyas SarangapaniHervé Nivon启发。CDK 模式自述文件详细介绍了它们的实现。

注意 - 这是一种学习模式,如果我在生产系统中实现它,我会做一些改变:

  • 尽可能使用事件批处理来降低成本
  • 事件中敏感数据的KMS加密
  • EventBridge 与 Lambda 之间的 SQS 可实现弹性
  • 将错误事件添加到 EventBridge 和错误事件规则

解构 EventBridge ETL

何时使用

此模式更多地展示了 EventBridge 在构建复杂的解耦流程方面的可能性。我会用它来学习 EventBridge。

 替代方案

AWS Glue 用于复杂的流程,或者您可以使用 Lambda 函数从 S3 流式传输更大的文件。


Lambda 功率调谐器

Lambda 电源调谐器拱门

cdk 模式链接

这是一个 AWS CDK 项目,它部署了Alex Casalboni的出色的AWS Lambda Power Tuning项目。

AWS Lambda Power Tuning 是一种 AWS Step Functions 状态机,可帮助您以数据驱动的方式优化 Lambda 函数。

何时使用

如果您在应用程序中使用 Lambda 函数,您将需要使用 Lambda Power Tuning 步骤函数来优化性能与成本。

 替代方案

只要足够努力,你就可以手动调整


Lambda 三部曲

Lambda 三部曲拱门

cdk 模式链接

这是三种模式,代表 AWS Lambda 的三种状态。

自 AWS Lambda 诞生以来,它的三种状态就一直是众多无服务器领域的大拿讨论的话题。这可能是无服务器领域最具争议的话题,所以我不会告诉你哪一种状态是最好的,因为就像所有事情一样,你需要根据自己的情况调整合适的实现!

此模式包括Paul SwailYan CuiJeremy Daly等人的例子

解构 Lambda 三部曲

何时使用

如果您在应用程序中使用 Lambda 函数,则需要使用以下三种状态之一


RDS 代理

RDS 代理架构

cdk 模式链接

该项目已配置 MySQL RDS 数据库、RDS 代理、用于运行查询的 Lambda 函数以及用于触发 Lambda 函数的 API 网关 HTTP API。RDS 代理旨在弥补高可扩展性、无服务器 Lambda 函数与可扩展性较差的 RDS 实例之间的差距。

何时使用

如果您需要无服务器组件与非无服务器 RDS 实例进行同步通信

 替代方案

如果你可以异步,你可以使用可扩展的 webhook


SAGA 步骤函数

saga 步骤函数

cdk 模式链接

此模式演示了如何在无服务器系统中处理分布式事务。它还演示了受Alex Debrie启发的单表 DynamoDB 设计。

解构 Saga Step Function

何时使用

如果您需要使多个较小的交易在一个原子单元中通过或失败,就像在预订假期并需要一起预订航班和酒店的情况下一样。

 替代方案

这是使用 Step Functions 实现的 SAGA 设计模式,您可以尝试使用其他组件实现它,但效率可能会较低。


可扩展的 Webhook

可扩展的 webhook arch

这是Jeremy Daly提出的一种模式,用于在异步流中将 Lambda 等无服务器资源与 RDS 等非无服务器资源集成在一起。

解构可扩展的 Webhook

何时使用

如果您无法预测流量,则可以使用异步流程来处理事件

 替代方案

RDS 代理但可扩展的 webhook 可以应用于任何资源,而不仅仅是 RDS。


简单的 GraphQL 服务

简单的 graphql arch

cdk 模式链接

这是 AWS AppSync 的一个简单 MVP 实现,使用 GraphQL 查询 Lambda 解析器和 DynamoDB 表。

何时使用

GraphQL 允许你的用户指定他们需要从你的 API 获取哪些信息,这非常强大。它还可以作为不同 API 之上的额外统一包装器。

 替代方案

您可以在 Lambda 函数中部署 Apollo


 简单的 Web 服务

简单的 Web 服务架构

cdkpatterns 上最基本的模式,也是大多数人无服务器之旅的起点。这是一个 API 网关 HTTP API,连接到一个用于查询 DynamoDB 的 Lambda 函数。

何时使用

如果您需要使用 RESTful 端点公开您的 DynamoDB 表(或其他无服务器组件)。

 替代方案

简单的 GraphQL 服务和 Dynamo Streamer


状态机

状态机拱门

cdk 模式链接

这是一个简单的状态机实现,使用 Step Functions 来实现Jeremy Daly描述的同名模式

何时使用

如果多个 Lambda 函数之间有复杂的编排逻辑

 替代方案

还可以使用 EventBridge 和规则构建事件驱动流程。不过,Step Functions 可以免费提供很多功能,例如对每个执行步骤的完整洞察。


 X射线追踪器

X射线追踪拱门

cdk 模式链接

了解如何使用 AWS X-Ray 跟踪系统中的事件。本 Pattern 在 API 网关、Lambda、DynamoDB、外部 HTTP 调用、SNS 和 SQS 上启用了 X-Ray

何时使用

如果你在系统中使用无服务器组件,则应该使用跟踪系统来了解其行为

 替代方案

你可以使用一些第三方替代方案,例如Thundra


文章来源:https://dev.to/nideveloper/cdk-patterns-at-20-let-s-walk-through-all-20-serverless-patterns-for-aws-d1n
PREV
2020 年 Web 开发者最佳播客
NEXT
关于 CORS 你应该知道什么 CORS 是什么,以及它不是什么 CORS 的工作原理。它在浏览器中的样子 CORS 的棘手之处