利用 DynamoDB Accelerator(DAX)实现内存中加速 - Amazon DynamoDB

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

利用 DynamoDB Accelerator(DAX)实现内存中加速

Amazon DynamoDB 具有很高的可扩展性和性能。大多数情况下,DynamoDB 响应时间在几毫秒内。但是,还存在需要微秒级响应时间的特定使用案例。对于这些使用案例,DynamoDB Accelerator (DAX) 为访问最终一致性数据提供快速响应时间。

DAX 是一项与 DynamoDB 兼容的缓存服务,可让您受益于针对要求苛刻的应用程序的极高内存中性能。DAX 解决三个核心场景:

  1. 作为内存中的缓存,DAX 将最终一致性读取工作负载的响应时间缩短了一个量级,从毫秒级缩短到了微秒级。

  2. DAX 提供与 DynamoDB API 兼容的托管服务,减少操作和应用程序复杂性。因此,它只需要最少的功能更改即可用于现有应用程序。

  3. 对于读取量大或突发式的工作负载,DAX 通过降低过度预置读取容量单位来实现吞吐量增加和潜在运营成本节省。对于需要针对各个键进行重复读取的应用,这一点尤其有用。

DAX 支持服务器端加密。利用静态加密,将加密 DAX 在磁盘上保留的数据。在将主节点中的更改传播至只读副本时,DAX 将数据写入磁盘。有关更多信息,请参阅 DAX 静态加密

DAX 还支持传输过程中的加密,确保应用程序和集群之间的所有请求和响应都通过传输级别安全性 (TLS) 加密,可以通过验证集群 x509 证书来验证与集群的连接。有关更多信息,请参阅DAX 传输加密

DAX 使用案例

DAX 提供针对 DynamoDB 表中最终一致性数据的访问权限(延迟以微秒为单位)。一个多可用区 DAX 集群每秒可处理数百万个请求。

DAX 非常适合以下类型的应用程序:

  • 需要尽可能短的读取响应时间的应用程序。示例包括实时出价、社交游戏和交易应用程序。DAX 为这些使用案例提供快速内存内读取性能。

  • 比其他应用程序更频繁地读取少量项目的应用程序。例如,考虑对某个热门产品进行一日促销的电子商务系统。在销售期间,与所有其他产品相比,对该产品(及其在 DynamoDB 中的数据)的需求将急剧增加。为了消除“热门”键和不均匀流量分布的影响,可以将读取活动转移到一个 DAX 缓存,直到一日促销结束。

  • 不但需要进行大量读取,而且对成本很敏感的应用程序。利用 DynamoDB,可以预置应用程序需要的每秒读取次数。如果读取活动增加,可以增加表的预置读取吞吐量(需额外付费)。或者,也可以将活动从您的应用程序转移到某个 DAX 集群,减少需要另行购买的读取容量单元的数量。

  • 需要针对大量数据进行重复读取的应用程序。此类应用程序可能会从其他应用程序转移数据库资源。例如,长时间运行的区域气候数据分析可能会临时占用 DynamoDB 表中的所有读取容量。这种情况对需要访问相同数据的其他应用程序会产生负面影响。利用 DAX,可以改为对缓存数据进行天气分析。

DAX 适合以下类型的应用程序:

  • 需要强一致性读取(或无法容忍最终一致性读取)的应用程序。

  • 不需要读取的微秒响应时间的应用程序,或不需要转移基础表中的重复读取活动的应用程序。

  • 需要进行大量写入或不执行太多读取活动的应用程序。

  • 已在将其他缓存解决方案用于 DynamoDB 并将其自己的客户端逻辑用于使用该缓存解决方案的应用程序。

DAX 使用注意事项

  • 有关 DAX 可用的 AWS 区域的列表,请参阅 Amazon DynamoDB 定价

  • DAX 支持使用 Go、Java、Node.js、Python 和 .NET 编写的应用程序(通过 AWS 为这些编程语言提供的客户端)。

  • DAX 仅适用于 EC2-VPC 平台。

  • DAX 集群服务角色策略必须允许 dynamodb:DescribeTable 操作才能维护有关 DynamoDB 表的元数据。

  • DAX 集群维护有关所存储项目的属性名称的元数据。该元数据无限期维护(即使项目已过期或者从缓存中移出)。随着时间的推移,使用不限制数量的属性名称的应用程序会耗尽 DAX 集群中的内存。此限制仅适用于顶级属性名称,不适用于嵌套属性名称。有问题的顶级属性名称的示例包含时间戳、UUID 和会话 ID。

    此限制仅适用于属性名称,而不适用于它们的值。类似下面的项目不存在问题。

    { "Id": 123, "Title": "Bicycle 123", "CreationDate": "2017-10-24T01:02:03+00:00" }

    但类似下面的项目会存在问题(如果有足够多这样的项,并且它们每个都有不同的时间戳)。

    { "Id": 123, "Title": "Bicycle 123", "2017-10-24T01:02:03+00:00": "created" }