1

我们目前正在设计一个 dynamodb 表来存储某些文件属性。有2个主要列

  1. 日期:- 这包含 YYMMDD 格式的日期,例如:-20190618
  2. 文件名:- xxxxxxxxxxxx.json

目前分区键是日期,排序键是文件名。我们预计每天大约有 500000 个具有不同文件名的文件(这可能会随着时间的推移而增加)。文件名每天都会重复相同,即典型模式如下所示

日期 文件名 20190617 abcd.json 20190618 abcd.json

我们有一系列基于Date和 dynamodb 触发器的查询。查询运行良好。目前我们正在观察的是并发 lambda 执行的数量限制为 2,因为我们是按日期分区的。在尝试提高 lambda 的并发性时,我们遇到了 2 个解决方案

1)参考以下链接(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-sharding.html),一个想法是为日期字段添加固定数量的随机后缀,即(20190617.1 到 20190617.500)将数据分成 500 个分区,每个分区 1000 条记录。这将确保一定程度的并发性,并且查询的更改也很小

2)第二个选项是更改表的分区如下分区键:- 文件名和排序键:- 日期。这将导致大约 500000 个分区,(可以增加)。对于按日期查询,我们需要添加一个 GSI,但我们将在 Lambda 中实现更多并发

我们还没有创建一个有 500000 个分区(可以增加)的表。任何机构都有这样的经验......如果是这样,请发表评论

任何帮助表示赞赏

4

2 回答 2

2

您似乎误以为分区键和分区之间存在一对一的对应关系。

不是这种情况。

分区数由表大小和吞吐量决定。分区键由 DDB 散列,数据存储在特定分区中。

你可以有 100k 个分区键并且只有一个分区。

如果您要突破 DDB 的限制,那么是的,您最终可能会在分区中只有一个分区键……但这并不典型。

DDB 白皮书提供了有关 DDB 工作原理的一些详细信息……

于 2019-06-19T13:49:08.427 回答
1

如果您的访问模式是按日期查询,则按文件名分区没有多大意义。

相反,通过添加后缀来增加每个日期的分区数量的想法似乎很好。但与其添加随机后缀,不如考虑根据文件名添加稳定后缀:

您可以使用文件名的第一个字母来获得大约 30 个分区 - 假设文件名是随机的。唯一的问题是某些字母可能比其他给出倾斜子分区的字母更常见

或者,您可以获取文件名的哈希值并将其用作分区键的后缀。散列函数可以是一个相对简单的散列函数,它产生一个目标数值,该数值对应于您希望为每个日期拥有的子分区的数量。

如果最终每个分区大约有 10000-50000 个项目,那可能会很棒。

希望这可以帮助

于 2019-06-19T04:44:13.253 回答