繁体   English   中英

Lambda with DynamoDB触发器在表上具有超过500000个不同值的分区键

[英]Lambda with DynamoDB Trigger on a table Partition Key with more than 500000 distinct values

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

  1. 日期: - 包含YYMMDD格式的日期,例如:-20190618
  2. FileName: - xxxxxxxxxxx.json

目前,分区键是Date,排序键是FileName。 我们预计每天大约有500000个文件具有不同的文件名(这可能会在一段时间内增加)。 文件名将每天重复相同,即典型的模式如下所示

Date FileName 20190617 abcd.json 20190618 abcd.json

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

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

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

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

任何帮助表示赞赏

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

不是这种情况。

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

您可以拥有100k分区密钥,只有一个分区。

如果你正在推动DDB的限制,那么你可能最终只能在一个分区中使用一个分区键...但这不是典型的。

DDB白皮书提供了DDB如何工作的一些细节......

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

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

你可以使用文件名的第一个字母来获得大约30个分区 - 假设文件名是随机的。 唯一的麻烦是某些字母可能比其他字母更为常见,从而产生偏差的子分区

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

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

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM