

# 为基于 Lambda 的应用程序选择数据库服务
<a name="ddb-rds-database-decision"></a>

许多无服务器应用程序需要存储和检索数据。Amazon 提供了多个与 Lambda 函数一起使用的数据库选项。最受欢迎的两个选项是 Amazon DynamoDB（NoSQL 数据库服务）和 Amazon RDS（传统关系数据库解决方案）。以下几节将说明这些服务在与 Lambda 一起使用时的主要区别，并帮助您为无服务器应用程序选择合适的数据库服务。

要详细了解由 Amazon 提供的其他数据库服务，并更广泛地了解其用例和权衡，请参阅 [Choosing an Amazon database service](https://docs.amazonaws.cn/decision-guides/latest/databases-on-aws-how-to-choose/databases-on-aws-how-to-choose.html)。所有 Amazon 数据库服务都与 Lambda 兼容，但并非所有服务都适合您的特定用例。

## 选择使用 Lambda 的数据库服务时，您有哪些选择？
<a name="w2aac15c43d101c19b9"></a>

Amazon 提供多种数据库服务。对于无服务器应用程序，最受欢迎的两个选择是 DynamoDB 和 Amazon RDS。
+ **DynamoDB** 是一项完全托管的 NoSQL 数据库服务，其针对无服务器应用程序进行了优化。该服务可在任何规模下提供无缝的扩展和一致的个位数毫秒级性能。
+ **Amazon RDS** 是一项托管关系数据库服务，其支持多个数据库引擎，包括 MySQL 和 PostgreSQL。该服务通过托管基础架构提供熟悉的 SQL 功能。

## 在已经知道自己要求的情况下的建议
<a name="w2aac15c43d101c19c11"></a>

如果您已经明确自己的要求，则以下是我们的基本建议：

对于需要一致的低延迟性能、自动扩展且不需要复杂联接或事务的无服务器应用程序，建议使用 [DynamoDB](with-ddb.md)。由于其无服务器性质，该服务特别适合基于 Lambda 的应用程序。

当您需要复杂的 SQL 查询、联接或拥有使用关系数据库的现有应用程序时，[Amazon RDS](services-rds.md) 是更好的选择。但请注意，将 Lambda 函数连接到 Amazon RDS 需要额外的配置，并且可能会影响冷启动时间。

## 选择数据库服务时需要考虑的因素
<a name="w2aac15c43d101c19c13"></a>

在为您的 Lambda 应用程序选择 DynamoDB 或 Amazon RDS 时，请考虑以下因素：
+ 连接管理和冷启动
+ 数据访问模式
+ 查询的复杂性
+ 数据一致性要求
+ 扩展特征
+ 成本模型

通过了解这些因素，您可以选择能满足自己特定用例需求的最佳选项。

### 连接管理和冷启动
<a name="w2aac15c43d101c19c13b9b1"></a>
+ DynamoDB 对所有操作都使用 HTTP API。Lambda 函数可以在不维护连接的情况下立即发出请求，从而提高冷启动性能。每个请求都使用 Amazon 凭证进行身份验证，而不会产生连接开销。
+ Amazon RDS 需要管理连接池，因为其使用传统数据库连接。这可能会影响冷启动，因为新的 Lambda 实例需要建立连接。您需要实施连接池策略，并有可能使用 [Amazon RDS 代理](https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/rds-proxy.html)来有效地管理连接。请注意，使用 Amazon RDS 代理会产生额外的费用。

### 数据访问模式
<a name="w2aac15c43d101c19c13b9b3"></a>
+ DynamoDB 最适合已知的访问模式和单表设计。其非常适合需要基于主键或二级索引对数据进行一致低延迟访问的 Lambda 应用程序。
+ Amazon RDS 为复杂的查询和不断变化的访问模式提供了灵活性。当您的 Lambda 函数需要在多个表之间执行独特、量身定制的查询或复杂联接时，该服务更适合。

### 查询的复杂性
<a name="w2aac15c43d101c19c13b9b5"></a>
+ DynamoDB 擅长简单、基于键的操作和预定义的访问模式。复杂的查询必须围绕索引结构进行设计，且联接必须在应用程序代码中进行处理。
+ Amazon RDS 支持带有联接、子查询和聚合的复杂 SQL 查询。当需要复杂的数据操作时，这可以简化您的 Lambda 函数代码。

### 数据一致性要求
<a name="w2aac15c43d101c19c13b9b7"></a>
+ DynamoDB 提供最终一致性和强一致性选项，单项读取可使用强一致性。其支持事务，但有一些限制。
+ Amazon RDS 提供完整的原子性、一致性、隔离性与持久性（ACID）合规以及复杂的事务支持。如果您的 Lambda 函数需要复杂的事务或多条记录之间的强一致性，则 Amazon RDS 可能更合适。

### 扩展特征
<a name="w2aac15c43d101c19c13b9b9"></a>
+ DynamoDB 会根据您的工作负载自动扩展。其无需预置即可处理来自 Lambda 函数的流量突然猛增。您可以使用按需容量模式，以仅为使用的容量付费，该模式与 Lambda 的扩展模型完美匹配。
+ 根据您选择的实例大小，Amazon RDS 具有固定容量。如果多个 Lambda 函数尝试同时连接，则可能会超出连接配额。您需要仔细管理连接池，并有可能实施重试逻辑。

### 成本模型
<a name="w2aac15c43d101c19c13b9c11"></a>
+ DynamoDB 的定价与无服务器应用程序非常吻合。使用按需容量，您只需为 Lambda 函数执行的实际读取和写入付费。空闲时间不收取任何费用。
+ 无论使用情况如何，Amazon RDS 都会对正在运行的实例收费。对于无服务器应用程序中典型的零星工作负载，此服务的成本效益可能较低。但对于持续使用的高吞吐量工作负载来说，此服务可能更经济。

## 开始使用您所选的数据库服务
<a name="w2aac15c43d101c19c15"></a>

现在，您已经了解了在 DynamoDB 与 Amazon RDS 之间进行选择的标准以及两者之间的主要区别，您可以选择最符合自己需求的选项，并通过以下资源开始使用。

------
#### [ DynamoDB ]

**通过以下资源开始使用 DynamoDB**
+ 有关 DynamoDB 服务的简介，请阅读《Amazon DynamoDB 开发人员指南》**中的[什么是 DynamoDB？](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/Introduction.html)。
+ 按照教程：[利用 API Gateway 使用 Lambda](services-apigateway-tutorial.md) 进行操作，查看使用 Lambda 函数响应 API 请求对 DynamoDB 表执行 CRUD 操作的示例。
+ 阅读《Amazon DynamoDB 开发人员指南》**中的[使用 DynamoDB 和 Amazon SDK 编程](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/Programming.html)，了解如何使用其中一个 Amazon SDK 从 Lambda 函数内访问 DynamoDB 的更多信息。

------
#### [ Amazon RDS ]

**通过以下资源开始使用 Amazon RDS**
+ 有关 Amazon RDS 服务的简介，请阅读《Amazon Relational Database Service 用户指南》**中的[什么是 Amazon Relational Database Service (Amazon RDS)？](https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/Welcome.html)。
+ 按照《Amazon Relational Database Service 用户指南》**中的教程：[使用 Lambda 函数访问 Amazon RDS 数据库](https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/rds-lambda-tutorial.html)进行操作。
+ 通过阅读[将 Amazon Lambda 与 Amazon RDS 结合使用](services-rds.md)，了解有关将 Lambda 与 Amazon RDS 搭配使用的更多信息。

------