InfoQ|一个经典的100%无服务器架构在AWS上是什么样?( 三 )


本文插图

在我们网站中 , 我们希望使用相比于原始自动生成的 S3 URL 更好的 URL , 为了做到这一点 , 我们使用 Certificate Manager 来生成证书 , 并将其绑定在 CloudFront , 并使用 Route 53 来管理域名 。
业务逻辑接口
InfoQ|一个经典的100%无服务器架构在AWS上是什么样?
本文插图
现在 , 我们的网站需要连接后端 , 以获得和推送数据 。 为此 , 我们使用 API Gateway 来处理 HTTP 连接和路由 , 并为每个路由同步触发一个 Lambda 函数 。 我们的 Lambda 函数包含与 DynamoDB 通信的业务逻辑 , 以便存储和使用数据 。
https://aws.amazon.com/cn/api-gateway/
如上文所示 , 我们是事件驱动的 , 这意味着我们会立即回复用户请求 , 然后 , 继续在后台异步地处理请求 。 例如 , DynamoDB 提供了流(Streams) , 它可以对任何数据改动作出反应 , 并且异步地触发 Lambda 函数 。 大多数无服务器架构的服务都有类似的功能 。
【InfoQ|一个经典的100%无服务器架构在AWS上是什么样?】DynamoDB 本身是一个非常大的话题 , 在这篇文章中 , Rob Cronin 解答并化解了 了一些关于“臭名昭著的”NoSQL 数据库的一些经典问题和疑虑 。
https://medium.com/serverless-transformation/how-to-remain-agile-with-dynamodb-eca44ff9817
异步任务
InfoQ|一个经典的100%无服务器架构在AWS上是什么样?
本文插图
我们的架构是事件驱动的 , 所以我们许多的 Lambda 函数都是异步的 , 通常是由 EventBridge 事件、S3 事件、DynamoDB 流等事件触发 。 例如 , 我们可以有一个异步 Lambda 函数 , 负责在成功注册后发送欢迎电子邮件 。
在分布式异步系统中 , 故障处理是非常重要的 。 所以对于异步的 Lambda 函数 , 我们使用它们的死信队列(Dead Letter Queue , DLQ) , 并且将最终的故障信息首先传递给 Simple Notification Service(SNS) , 然后再传给 Simple Queue Service(SQS) 。 我们现在必须这样做 , 因为 AWS 暂时还不支持将 SQS 直接连接到 Lambda DLQ 上 。
https://aws.amazon.com/cn/sns/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc
https://aws.amazon.com/cn/sqs/
后端向前端的推送
InfoQ|一个经典的100%无服务器架构在AWS上是什么样?
本文插图

有了异步的操作 , 前端不能在等待一个 XHR 响应时仅仅显示一个加载页面 。 我们需要后端的预备状态和数据推送 。 为此 , 我们利用了 API Gateway 的 WebSocket , 这个 API 可以使 WebSocket 保持连接状态 , 并且仅在在收到消息时触发 Lambdas 函数 。 我写了 一篇文章深入讨论了相比较于其他解决方案 , 为什么我们选择了 WebSocket , 以及如何实现它 。
https://medium.com/serverless-transformation/asynchronous-client-interaction-in-aws-serverless-polling-websocket-server-sent-events-or-acf10167cc67
文件上传
InfoQ|一个经典的100%无服务器架构在AWS上是什么样?
本文插图

处理 Lambda 的文件上传流(Stream)可能会造成较大的开销 。 相较于这个方案 , S3 还提供了一个功能 , 使得前端能使用由 Lambda 生成的、签名(安全)的上传 URL 来直接上传文件到 S3 。
用户与认证
InfoQ|一个经典的100%无服务器架构在AWS上是什么样?
本文插图

Cogito 有我们所需要的所有东西:认证、用户管理、访问控制以及外部身份提供商集成 。 尽管大家知道它使用起来有些复杂 , 但它确实可以为我们做不少事情 。 和其他服务一样 , 它由专用的 SDK 来与 Lambda 交互 , 并且可以分发事件以触发 Lambda 。 在我们的例子中 , 我们说明了将原生 Cogito 授权者绑定在我们的 API Gateway 路由上的可能性 。 我们也暴露了一个用于刷新身份验证令牌的 Lambda 函数和一个用于获取用户列表的 Lambda 函数 。


推荐阅读