AWS DynamoDB 与 RDS for Lambda 无服务器架构

Pap*_*its 5 amazon-web-services amazon-rds amazon-dynamodb aws-lambda serverless

我所在的团队目前正在为政府办公室和公众(目前范围缩小到卫生部门)之间的通信服务开发概念验证架构/应用程序。客户特别要求通过 AWS 服务采用主要无服务器的方法,我需要有关如何设置此架构(即 Lambda 与数据库关系)的建议。

粗略地说,该架构将利用 API Gateway 来处理请求,这将调用不同的 Lambda 作为微服务来访问数据库。

下图描述了快速关系架构。基本上,患者输入对其病情的描述,这构成了案例的基础。该病例由一名或多位护士在一次或多次会议期间处理,并记录与该病例相关的笔记。DB Schema(声誉不够)

根据我的研究,我发现就 RDS 而言,需要在安全性之间进行权衡(将 Lambda 保留在包含 RDS 实例的公共 VPC 之外,放弃安全最佳实践,这是公共部门的禁忌) )和性能(将 Lambda 放在带有 RDS 实例的私有 VPC 中,并由于 ENI 的配置而导致冷启动时间过长)。不过,可以通过使用 CloudWatch 对冷启动时间进行 ping 来取消冷启动时间,这可能是最佳的,也可能不是最佳的。

就 DynamoDB 而言,我个人非常缺乏经验(比 MySQL 更缺乏经验)并且不确定数据是否适用于 NoSQL 模型。如果是的话,DynamoDB 似乎是更好的方法。但根据我的理解,NoSQL 对涉及 JOIN 等的复杂查询的支持较少,这可能会消除它作为一个选项。

就数据/关系而言,感觉 SQL/RDS 更合适,但如果找到合适的数据模型,DynamoDB 会给 Lambda/AWS 服务带来更少的问题。所以我的问题是,是否最好选择私有 RDS 实例并尝试通过预热最关键的 Lambda 来消除冷启动,或者是否有一个不会导致复杂查询等问题的 NoSQL 模型事物?我是否遗漏了任何可能改变局面的关键方面?

小智 4

让我们首先澄清您的一些相当严重的误解:

根据我的研究,我发现就 RDS 而言,需要在安全性(将 Lambda 保持在公共 RDS 实例之外、放弃安全最佳实践、公共部门的禁忌)和性能之间进行权衡(将 Lambda 放入私有 RDS 实例中,并导致冷启动时间过长)。不过,可以通过使用 CloudWatch 对冷启动时间进行 ping 来取消冷启动时间,这可能是最佳的,也可能不是最佳的

  1. RDS是一个数据库服务器。您无需在其内部或外部运行任何东西。
  2. 您可能会想到 VPC,即虚拟私有云。这是一个隔离网络,您可以在其中运行 RDS 实例和 Lambda。
  3. 在 VPC 内部或外部运行对冷启动时间没有影响。当 AWS 必须启动一个新容器来运行您的 Lambda 时,您需要支付冷启动费用。发生这种情况的原因可能是它最近没有运行,或者是因为它需要扩展以满足并发请求。实际的冷启动时间取决于您的语言:例如,Java 比 Python 慢得多,因为它需要在执行任何操作之前启动 JVM 并加载类。

现在回答你的实际问题

基本上,患者输入对其病情的描述,这构成了案例的基础。该病例由一名或多位护士在一次或多次会议期间处理,并记录与该病例相关的笔记。

可以在 NoSQL 数据库(例如 DynamoDB)中实现。如果没有更多信息,我可能会将会话作为基础文档,使用案例 ID 作为分区键,使用会话 ID 作为排序键。如果您不理解这些术语的含义,以及如何根据该键构建文档,那么您可能不应该使用 DynamoDB。

使用 DynamoDB 的一个更大原因与访问模式有关。您是否想查找指定护士处理过的所有病例?或者与特定患者有关?这些类型的查询正是关系数据库的设计目的。

就 DynamoDB 而言,我个人非常缺乏经验(比 MySQL 更缺乏经验)

您的团队中有人熟悉 NoSQL 数据库吗?如果没有,那么我认为你应该坚持使用 MySQL。学习如何使用 Lambda 时您将面临足够的挑战。

  • “在 VPC 内部或外部运行对冷启动时间没有影响。” - 目前在 VPC 中运行的 Lambda 对冷启动时间有非常大的影响,因为它可能必须配置 ENI(弹性网络接口),这通常会增加大约 10 秒的冷启动时间。在上次 re:Invent Lambda 团队表示,这个问题将在今年得到解决(ENI 将在 Lambda 创建过程中创建,而不是调用)。 (3认同)