【发布时间】:2018-07-11 23:45:53
【问题描述】:
我已经包含了一些链接以及我们对其他答案的方法,这似乎是目前网络上最优化的。
我们的记录需要分类(例如“恐怖片”、“惊悚片”、“电视”),并且可以在特定类别和所有/某些类别中随机访问。我们通常需要一次访问大约 20 - 100 个项目。我们也有少量的类别(少于 100 个)。
我们写入数据库以上传/删除内容,尽管这是分批完成的,不需要实时。
我们尝试了两种不同的方法,使用两种不同的数据结构。
方法 1
AWS DynamoDB - Pick a record/item randomly?
Help selecting nth record in query.
简而言之,使用类别作为哈希键,使用 UUID 作为排序键。生成一个随机 UUID,使用大于或小于查询 Dynamo,并限制为 1。这甚至是 AWS 员工在第二个链接中建议的。 (我们也尝试过增加对所需项目数量的限制,但这会增加查询第一次失败的可能性)。
这种方法的问题:
- 如果大于/小于任何 UUID,第一个查询可能会失败
- 查询任何特定类别都会导致大规模节流(分区数量少)
我们还考虑为每个类别添加一个后缀,以人为地增加我们拥有的分区数量,如以下链接所述。
AWS Database Blog Choosing the Right DynamoDB Partition Key
方法2
Amazon Web Services: How do we get random item from the dynamoDb's table?
做类似的事情,我们将类别与序列号连接起来,并将其用作哈希键。例如恐怖000001。
通过了解每个类别中的记录数,我们能够对整个数据集执行随机查询,同时还可以避免热分区/键。
这种方法的问题
- 我们需要一个辅助数据结构来管理每个类别的顺序计数
- 写入(尤其是删除)要复杂得多,尽管这不需要实时进行。
结论
这两种方法都解决了我们对类别/类别进行随机查询的主要用例,但它们提供的缺点确实阻止了我们使用它们。我们更倾向于使用后缀的方法 #1 来解决热分区问题,尽管对于失败的查询我们需要额外的重试逻辑。
有没有更好的方法来解决这个问题?专门寻找能够很好地扩展(无扫描)的解决方案,而不需要实施额外的资源。 #1 符合要求,但需要管理后缀和失败的尝试确实阻止了我们使用它,尤其是在 lambda 中调用它时(按使用时间计费)。
谢谢!
【问题讨论】:
标签: amazon-web-services amazon-dynamodb