DynamoDB 利用DAX实现内存加速
- DAX 是一项与 DynamoDB 兼容的缓存服务,可让您受益于针对要求苛刻的应用的极高的内存内性能。DAX 可处理三个核心方案:
- 作为内存中的缓存,DAX 将最终一致性读取工作量的响应时间缩短了一个数量级 - 从毫秒级缩短到了微秒级。
- DAX 通过提供与 Amazon DynamoDB 在 API 上兼容的托管服务降低了运营和应用复杂性,并因此只需要进行最少的功能性更改就能与现有应用程序一起使用。
- 对于读取量大或突发式的工作负载,DAX 通过降低过度预置读取容量单位来增加吞吐量和潜在运营成本节省。对于需要针对各个密钥进行重复读取的应用,这尤其有用。
- 读取操作:
- GetItem
- BatchGetItem
- Query
- Scan
- 如果 DAX 有可用项目 (缓存命中),DAX 会将项目返回到应用程序而无需访问 DynamoDB。
- 如果 DAX 没有可用项目 (缓存未命中),DAX 会将请求传递到 DynamoDB。当收到来自 DynamoDB 的响应时,DAX 会将结果返回到应用程序 - 并且它还会将结果写入带主节点上的缓存。
- 写入操作:
- BatchWriteItem
- UpdateItem
- DeleteItem
- PutItem
- 采用这些操作后,数据将首先写入到 DynamoDB 表,然后写入到 DAX 集群。仅当数据同时 成功写入到表和 DAX 时,操作才会成功。
- DAX 无法识别用于管理表的任何 DynamoDB 操作 (如 CreateTable、UpdateTable 等)。如果您的应用程序需要执行这些操作,它需要直接访问 DynamoDB 而不是使用 DAX 来访问。
- 项目缓存:
- DAX 将保留一个项目缓存 以存储来自 GetItem 和 BatchGetItem 操作的结果。缓存中的项目表示来自 DynamoDB 的最终一致性数据,并且由其主键值存储。
- 项目缓存具有生存时间 (TTL) 设置,默认情况下为 5 分钟。DAX 将向其写入到项目缓存的每个项目分配时间戳。如果某个项目在缓存中保留的时间超出 TTL 设置,则会过期。如果您针对已过期项目发出 GetItem 请求,这将被视为缓存未命中,因此 DAX 会将 GetItem 请求发送到 DynamoDB。
- 查询缓存:
- DAX 还将保留一个查询缓存 以存储来自 Query 和 Scan 操作的结果。此缓存中的项目表示来自对 DynamoDB 表的查询和扫描的结果集。这些结果集由其参数值存储。
- 当某个应用程序发送了一条 Query 或 Scan 请求时,DAX 将尝试使用指定参数值从查询缓存读取匹配的结果集。如果找到结果集 (缓存命中),DAX 会将结果集立即返回到应用程序。如果未找到结果集 (缓存未命中),DAX 会将请求发送到 DynamoDB。DynamoDB 将使用最终一致性读取处理请求并将结果集返回到 DAX。DAX 会将结果集存储在项目缓存中,然后将它返回到应用程序。
- 步骤:
- DAX 客户端发出 GetItem 请求。DAX 尝试从项目缓存读取请求的项目。如果该项目在缓存中 (缓存命中),则 DAX 会将其返回到应用程序。
- 如果该项目不可用 (缓存未命中),则 DAX 会针对 DynamoDB 执行最终一致性 GetItem 操作。
- DynamoDB 返回请求的项目,DAX 将该项目存储在项目缓存中。
- DAX 将该项目返回到应用程序。
- (未显示) 如果 DAX 集群包含多个节点,则该项目将复制到集群中的所有其他节点。
DAX 集群组件
- 节点;
- 节点 是 DAX 集群的最小构建块。每个节点运行一个 DAX 软件实例,并维护一个缓存数据副本。
- 您可采用以下两种方法之一来扩展 DAX 集群:
- 将更多节点添加到集群。这会增加集群中的总体读取吞吐量。
- 使用较大的节点类型。较大的节点类型可提供更多容量并可增加吞吐量。(请注意,您必须使用新节点类型创建新集群。
- 集群
- 集群 是 DAX 将其作为一个单元来管理的一个或多个节点的逻辑分组。集群的其中一个节点被指定为主 节点,其他节点 (如果有) 被指定为只读副本。
- 主节点负责完成以下工作:
- 满足缓存数据的应用程序请求。
- 处理对 DynamoDB 的写入操作。
- 根据集群的移出策略,从缓存中移出数据。
- 当对主节点上的缓存数据进行更改时,DAX 会将这些更改传播到所有只读副本节点。
- 只读副本负责完成以下工作:
- 满足缓存数据的应用程序请求。
- 根据集群的移出策略,从缓存中移出数据。
- 但与主节点不同,只读副本不会对 DynamoDB 进行写入。