zoukankan      html  css  js  c++  java
  • DAX 和 DynamoDB 一致性模型

    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 客户端一起使用时,该操作(在本例中为最终一致性读取)按如下方式继续。

    
                    显示更新项目的编号步骤的工作流图表。
    1. DAX 客户端发出一个 GetItem 请求。DAX 尝试从项目缓存读取请求的项目。如果该项目在缓存中(缓存命中),则 DAX 会将其返回到应用程序。

    2. 如果该项目不可用(缓存未命中),则 DAX 将针对 DynamoDB 执行最终一致性 GetItem 操作。

    3. DynamoDB 返回请求的项目,DAX 将该项目存储在项目缓存中。

    4. DAX 将该项目返回到应用程序。

    5. (未显示)如果 DAX 集群包含多个节点,则该项目将复制到集群中的所有其他节点。

    项目根据 生存时间 (TTL) 设置和最近最少使用 (LUR) 算法,保留在 DAX 项目缓存中。

    写入的一致性

    DAX 是一种直写缓存,可简化使 DAX 项目缓存与基础 DynamoDB 表保持一致的过程。

    DAX 客户端支持与 DynamoDB 相同的写入 API 操作(PutItemUpdateItemDeleteItemBatchWriteItem 和 TransactWriteItems)。当您将这些操作与 DAX 客户端结合使用时,将在 DAX 和 DynamoDB 中修改这些项目。DAX 将在项目缓存中更新这些项目,无论这些项目的 TTL 值是什么。

    DAX 如何处理写入

    DAX 适用于需要高性能读取的应用程序。作为直写缓存,DAX 允许您直接发起写入操作,以便让您的写入立即反映在项目缓存中。您无需管理缓存失效逻辑,因为 DAX 会为您处理它。

    DAX 支持以下写入操作:PutItemUpdateItemDeleteItemBatchWriteItem 和 TransactWriteItems

    当您向 DAX 发送 PutItemUpdateItemDeleteItem 或 BatchWriteItem 请求时,将会执行下列操作:

    • DAX 将请求发送到 DynamoDB。

    • DynamoDB 回复 DAX,确认写入成功。

    • DAX 将项目写入到项目缓存。

    • DAX 将成功信息返回到请求者。

    DAX 查询缓存行为

    DAX 在其查询缓存中缓存来自 Query 和 Scan 请求的结果。但是,这些结果完全不影响项目缓存。当您的应用程序使用 DAX 发出 Query 或 Scan 请求时,结果集将保存在查询缓存 — 而不是项目缓存中。您无法通过执行 Scan 操作来“预热”项目缓存,因为项目缓存和查询缓存是独立的实体。

    强一致性读取和事务读取

    要执行强一致性 GetItemBatchGetItemQuery 或 Scan 请求,请将 ConsistentRead 参数设置为 true。DAX 会将强一致性读取请求传递到 DynamoDB。当它收到来自 DynamoDB 的响应时,DAX 会将结果返回到客户端,但不会缓存结果。DAX 无法自行处理强一致性读取,因为它未紧密耦合到 DynamoDB。出于此原因,从 DAX 进行的任何后续读取必须为最终一致性读取。任何后续的强一致性读取将传递到 DynamoDB。

    DAX 以处理强一致性读取的相同方式处理 TransactGetItems 请求。DAX 会将所有 TransactGetItems 请求传递到 DynamoDB。当收到来自 DynamoDB 的响应时,DAX 会将结果返回到客户端,但不会缓存结果。

     
  • 相关阅读:
    Qt中不同类型数据之间的相互转换
    数组传参
    sizeof和strlen区别
    打印字符‘烫’
    vivado hls(1)
    时序约束方法(2)
    FPGA浮点数定点化
    FPGA设计思想与技巧(转载)
    视频采集显示总结
    Verilog code
  • 原文地址:https://www.cnblogs.com/cloudrivers/p/11628517.html
Copyright © 2011-2022 走看看