DynamoDB Accelerator (DAX) 是一项直写缓存服务,旨在简化将缓存添加到 DynamoDB 表的过程。由于 DAX 是独立于 DynamoDB 运行的,因此您务必同时了解 DAX 和 DynamoDB 的一致性模型,以确保您的应用程序的行为方式符合预期。
在很多使用案例中,您的应用程序使用 DAX 的方式会影响 DAX 集群内的数据的一致性以及 DAX 和 DynamoDB 之间的数据的一致性。
DAX 集群节点之间的一致性
要为您的应用程序实现高可用性,建议您为 DAX 集群预配置至少三个节点。然后将这些节点置于某个区域内的多个可用区中。
当您的 DAX 集群正在运行时,它会复制该集群中所有节点之间的数据(假定您已预配置多个节点)。考虑一个使用 DAX 成功执行 UpdateItem
的应用程序。此操作会导致使用新值修改主节点中的项目缓存。然后,该值复制到集群中的所有其他节点。此复制具有最终一致性,并且通常只需不到一秒即可完成。
在这种情况下,两个客户端可从同一 DAX 集群读取同一键但接收不同的值,具体取决于每个客户端访问的节点。当更新已在集群中的所有节点中完全复制后,这些节点将全部具有一致性。(此行为类似于 DynamoDB 的最终一致性。)
如果您要构建一个使用 DAX 的应用程序,则应采用可容忍最终一致的数据的方式设计该应用程序。
DAX 项目缓存行为
每个 DAX 集群具有两个不同的缓存:一个项目 缓存和一个查询 缓存。
读取的一致性
利用 DynamoDB,默认情况下,GetItem
操作将执行最终一致性读取。假设您将 UpdateItem
与 DynamoDB 客户端一起使用。如果您随后立即尝试读取同一项目,则可能会看到数据在更新前的样子。这是由于所有 DynamoDB 存储位置中的传播延迟。通常,在几秒钟内即可实现一致性。因此,如果您重试读取,可能会看到更新后的项目。
当您将 GetItem
与 DAX 客户端一起使用时,该操作(在本例中为最终一致性读取)按如下方式继续。
-
DAX 客户端发出一个
GetItem
请求。DAX 尝试从项目缓存读取请求的项目。如果该项目在缓存中(缓存命中),则 DAX 会将其返回到应用程序。 -
如果该项目不可用(缓存未命中),则 DAX 将针对 DynamoDB 执行最终一致性
GetItem
操作。 -
DynamoDB 返回请求的项目,DAX 将该项目存储在项目缓存中。
-
DAX 将该项目返回到应用程序。
-
(未显示)如果 DAX 集群包含多个节点,则该项目将复制到集群中的所有其他节点。
项目根据 生存时间 (TTL) 设置和最近最少使用 (LUR) 算法,保留在 DAX 项目缓存中。
写入的一致性
DAX 是一种直写缓存,可简化使 DAX 项目缓存与基础 DynamoDB 表保持一致的过程。
DAX 客户端支持与 DynamoDB 相同的写入 API 操作(PutItem
、UpdateItem
、DeleteItem
、BatchWriteItem
和 TransactWriteItems
)。当您将这些操作与 DAX 客户端结合使用时,将在 DAX 和 DynamoDB 中修改这些项目。DAX 将在项目缓存中更新这些项目,无论这些项目的 TTL 值是什么。
DAX 如何处理写入
DAX 适用于需要高性能读取的应用程序。作为直写缓存,DAX 允许您直接发起写入操作,以便让您的写入立即反映在项目缓存中。您无需管理缓存失效逻辑,因为 DAX 会为您处理它。
DAX 支持以下写入操作:PutItem
、UpdateItem
、DeleteItem
、BatchWriteItem
和 TransactWriteItems
。
当您向 DAX 发送 PutItem
、UpdateItem
、DeleteItem
或 BatchWriteItem
请求时,将会执行下列操作:
-
DAX 将请求发送到 DynamoDB。
-
DynamoDB 回复 DAX,确认写入成功。
-
DAX 将项目写入到项目缓存。
-
DAX 将成功信息返回到请求者。
DAX 查询缓存行为
DAX 在其查询缓存中缓存来自 Query
和 Scan
请求的结果。但是,这些结果完全不影响项目缓存。当您的应用程序使用 DAX 发出 Query
或 Scan
请求时,结果集将保存在查询缓存 — 而不是项目缓存中。您无法通过执行 Scan
操作来“预热”项目缓存,因为项目缓存和查询缓存是独立的实体。
强一致性读取和事务读取
要执行强一致性 GetItem
、BatchGetItem
、Query
或 Scan
请求,请将 ConsistentRead
参数设置为 true。DAX 会将强一致性读取请求传递到 DynamoDB。当它收到来自 DynamoDB 的响应时,DAX 会将结果返回到客户端,但不会缓存结果。DAX 无法自行处理强一致性读取,因为它未紧密耦合到 DynamoDB。出于此原因,从 DAX 进行的任何后续读取必须为最终一致性读取。任何后续的强一致性读取将传递到 DynamoDB。
DAX 以处理强一致性读取的相同方式处理 TransactGetItems
请求。DAX 会将所有 TransactGetItems
请求传递到 DynamoDB。当收到来自 DynamoDB 的响应时,DAX 会将结果返回到客户端,但不会缓存结果。