HMi*_*adt 6 amazon-web-services amazon-dynamodb
我已经包括了一些链接以及我们对其他答案的使用方法,这些链接似乎是目前网络上最理想的。
我们的记录需要分类(例如,“恐怖”,“惊悚”,“电视”),并且可以在特定类别和所有/某些类别中随机访问。我们通常一次需要访问大约20-100个项目。我们的类别数量也很少(少于100个)。
我们将数据写入数据库以上传/删除内容,尽管这是分批完成的,不需要实时。
我们尝试了两种不同的方法,以及两种不同的数据结构。
简而言之,将类别用作哈希键,并将UUID用作排序键。生成一个随机UUID,使用大于或小于1的值来查询Dynamo,并限制为1。AWS员工甚至在第二个链接中建议这样做。(我们还尝试过增加对所需项目数的限制,但这增加了查询第一次失败的可能性)。
这种方法的问题:
我们还考虑过为每个类别添加后缀,以人为地增加我们拥有的分区数量,如以下链接所示。
亚马逊网络服务:我们如何从dynamoDb的表中获取随机物品?
与此类似,我们将类别与序列号连接起来,并将其用作哈希键。例如horror-000001。
通过了解每个类别中的记录数,我们可以对整个数据集执行随机查询,同时还避免了热分区/键。
这种方法的问题
两种方法都可以解决我们对类别进行随机查询的主要用例,但是它们提供的缺点实际上阻止了我们使用它们。我们更倾向于使用后缀来解决热分区问题的方法#1,尽管对于失败的查询,我们需要额外的重试逻辑。
有没有更好的方法来解决此问题?专门寻找能够很好地扩展(无需扫描)且无需实施额外资源的解决方案。#1符合要求,但是需要管理后缀和失败的尝试确实阻止了我们使用它,尤其是当它在lambda中被调用(根据使用时间计费)时。
谢谢!
对于评论来说太长了,我想现在这已经是一个完整的答案了。
方法2
我发现从 dynamodb 向同一区域的主机获取单个项目的典型时间小于 10 毫秒。只要您可以接受最多 1-2 个额外调用,您就可以非常轻松地实现方法 2。
如果您使用仅键 GSI,其中类别是哈希键,表的主键是范围键,则您可以快速找到类别中编号最大的单个项目。
添加新项目时,从 GSI 中找到该类别的最大编号,然后将新项目写入序号为 n+1 的表中。
删除时,从 GSI 中找到该类别的最大序列号的项目,覆盖要删除的项目,然后从最高序列号的位置删除现在重复的项目。
要随机获取项目,请查询 GSI 以查找类别中编号最大的项目,然后随机选择一个数字,因为您现在知道有效范围。
方法一
当你说“不需要额外的资源来实施”时,我不确定你到底是什么意思。如果您同意使用托管资源(无需实施开发工作),您还可以通过将 DAX 集群放在 dynamodb 表前面来使方法 1 发挥作用。然后您就可以随心所欲地查询,而不必真正担心热分区。(尽管缓存层意味着新的/删除的项目不会立即反映。)
| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |