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

Aws lambda 具有超过500000个不同值的表分区键上的DynamoDB触发器的Lambda,aws-lambda,amazon-dynamodb,amazon-dynamodb-streams,amazon-dynamodb-data-modeling,Aws Lambda,Amazon Dynamodb,Amazon Dynamodb Streams,Amazon Dynamodb Data Modeling,我们目前正在设计一个dynamodb表来存储某些文件属性。有两个主栏 日期:-包含年月日格式的日期,例如:-20190618 文件名:-xxxxxxxxxx.json 当前分区键是日期,排序键是文件名。我们预计每天大约有500000个文件具有不同的文件名(这可能会随着时间的推移而增加)。文件名每天重复相同,即典型模式如下所示 日期文件名 20190617 abcd.json 20190618 abcd.json 我们有一系列基于日期和dynamodb触发器的查询。这些查询非常有效。目前我们所观察

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

  • 日期:-包含年月日格式的日期,例如:-20190618
  • 文件名:-xxxxxxxxxx.json
  • 当前分区键是日期,排序键是文件名。我们预计每天大约有500000个文件具有不同的文件名(这可能会随着时间的推移而增加)。文件名每天重复相同,即典型模式如下所示

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

    我们有一系列基于日期和dynamodb触发器的查询。这些查询非常有效。目前我们所观察到的是,并发lambda执行的数量限制为2,因为我们是按日期划分的。在尝试改进lambda的并发性时,我们遇到了两种解决方案

    1) 参考以下链接(),一个想法是为日期字段添加固定数量的随机后缀,即(20190617.1到20190617.500),将数据拆分为500个分区,每个分区有1000条记录。这将确保一定量的并发性,并且对查询的更改也将是最小的

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

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


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

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

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

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

    如果每个分区有大约10000-50000个项目,那就太好了


    希望这能有所帮助

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

    事实并非如此

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

    您可以有100k个分区键,但只能有一个分区

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


    提供了DDB工作原理的一些详细信息…

    为什么您认为它会创建500000个分区?一天内可能会有500000个文件具有不同的名称,这不是它的工作原理。分区根据分区大小(10GB)或吞吐量进行拆分和扩展。e、 g.每个分区目前可以支持3000 IOPS。一次读取等于1 IOP,一次写入等于3 IOPS。如果任何分区的IOPS超过3000,或者您提供的容量超过了当前分区所能处理的容量,那么后台DynamoDB将创建必要的分区来处理该负载。谢谢您的评论。它有助于。。。一个问题是,一个带有文件名分区键的dynamodb表设计得很好。在第一天,每个分区将有一条记录,但是在一段时间内,如果使用文件名作为分区键,数据将增长,您将失去按日期查询的能力。只有当您的访问模式主要基于文件名时,它才有意义。所以答案是——这取决于……非常感谢。本文档以及以下链接帮助澄清了许多疑问