使用写入分区均匀分配工作负载 - Amazon DynamoDB

使用写入分区均匀分配工作负载

扩大空间是一种在 Amazon DynamoDB 的分区键空间更好地分配写入的方式。可以通过多种不同方式来进行。可以将随机数加入分区键值,在分区之间分配项目。或者,可以使用基于查询内容计算的数字。

使用随机后缀分区

将随机数加入分区键值末尾,是在分区键空间更均匀分配负载的一种策略。然后在更大空间内随机写入。

例如,对于表示当天日期的分区键,可能选择介于 1200 之间的随机数,并将它作为后缀连接到日期。这将生成分区键值 2014-07-09.12014-07-09.2,以此类推,直到 2014-07-09.200。由于随机化分区键,每天表的写入将均匀分布在多个分区。这样可以提高并行度和总体吞吐量。

但是,要读取指定日期的所有项目,必须针对所有后缀查询项目,然后合并结果。例如,先对分区键值 2014-07-09.1 发出 Query 请求。然后,对 2014-07-09.2 发出另一个 Query,以此类推,直到 2014-07-09.200。最后,应用程序必须合并所有 Query 请求的结果。

使用计算后缀分区

随机化策略可以显著改善写入吞吐量,但难以读取特定项目,因为不知道写入项目时使用的后缀值。要更容易读取各个项目,可使用其他策略。不使用随机数在分区间分配项目,而是使用可根据查询内容计算的数字。

考虑上一个示例,表在分区键中使用当天日期。现在假设每个项目有一个可访问的 OrderId 属性,除了日期外,最经常需要按订单 ID 查找项目。应用程序将项目写入表之前,可以根据订单 ID 计算一个哈希后缀,并将此后缀追加到分区键日期。计算可能产生一个介于 1 和 200 之间非常均匀分布的数字,类似于随机策略所生成的数字。

简单的计算足够了,例如订单 ID 字符的 UTF-8 码位值的乘积,取模 200,加 1。分区键值是连接计算结果的日期。

利用此策略,写入均匀分布在分区键值之间,从而均匀分布在物理分区之间。可以对特殊项目和日期轻松执行 GetItem 操作,因为可以为特定 OrderId 值计算分区键值。

要读取指定日期的所有项目,仍必须Query每个 2014-07-09.N 键(其中,N 为 1-200),然后应用程序必须合并所有结果。好处是避免出现单个“热门”分区键值,承担所有工作负载。

注意

有关专门设计用于处理大容量时间序列数据的更高效策略,请参见时间序列数据