为什么在AWS DynamoDB中使用公共哈希密钥是一件坏事?

Rya*_*yan 8 amazon-web-services nosql amazon-dynamodb

我需要有一种方法来按时间戳排序项目,所以我正在考虑使用公共哈希键和unix时间戳作为范围键.

根据FAQ:

When storing data, Amazon DynamoDB divides a table into multiple partitions and 
distributes the data based on the hash key element of the primary key. The provisioned 
throughput associated with a table is also divided among the partitions; each 
partition's throughput is managed independently based on the quota allotted to it. 
There is no sharing of provisioned throughput across partitions. 
Run Code Online (Sandbox Code Playgroud)

由于我使用的是公共哈希密钥,因此不会出现不均匀的负载分配 - 因为所有负载都将进入单个分区.

因此,当我配置100 write到这个分区时,将使用所有容量,那么我认为这是一件好事,因为容量没有被浪费?

Eri*_*ond 8

您可以将写入和读取配置到DynamoDB表,而不是分区.您的容量在分区之间传播/共享,但由于底层硬件,每个分区也具有固定的速率限制.

通过使用单个哈希键,无论您配置和支付多少,您都可以对表上实际执行的读写数量进行固定限制.

您无法将其扩展到该限制之上,因为dynamodb无法进一步对您的表进行分区以并行化负载处理,这是AWS随着您的配置数量增加而扩展系统的主要方式之一.

您可能最初不会达到此限制,但亚马逊建议不要使用此方法,因为亚马逊希望您以可扩展的方式使用AWS.

  • 我怀疑亚马逊会分享这样的信息,因为他们可以改变它的工作方式,即使对于一个DynamoDB表也是如此.例如,may可以通过启动不同的实例类型在垂直方向上进行缩放,然后通过分区添加水平缩放.通过使分区越来越小,水平缩放可以是无限的.该指南仅用于扩展您的密钥空间,以便它们可以有效地扩展到任何预配限制. (2认同)

oDD*_*ooL 7

在你的情况下,一个常见的技巧是

  • hash_key=%Y-%m-%d (日间时间戳)
  • range_key=iso-8601_timestamp+uuid

通过这种方式,您的数据按天划分为分区(假设从一天到另一天的负载相当均匀),但是范围键允许query使用BETWEEN条件进行非常精细的调用.这uuid部分用于区分(完全)同时插入的记录.