查询具有低分布的DynamoDB索引

时间:2017-06-28 04:39:42

标签: optimization amazon-dynamodb

只是想知道这是否是解决此问题的最佳方法。

情景

我们正在建立一个在线体育经理游戏。在我们的游戏中有团队,团队将在我们称之为“#34; fixtures"”的情况下互相玩耍。

在每个赛季开始时,创建赛季的赛程并输入表格,例如夹具项目可能指定团队1与团队2,12月1日晚7点。

每个灯具的游戏玩法都是在灯具开始时创建的,以考虑团队所有者在此之前所做的更改。

我们有一个调度程序需要检查表中的夹具:1)没有运行,2)其开始日期为<=。我们包括&#34;少于&#34;因此,如果出现系统问题或停机,我们可以赶上任何可能仍在等待运行的比赛。

问题

我们如何在大型dynamodb表中搜索尚未运行的灯具,其开始日期现在或更早。

当前解决方案

目前的计划是创建一个名为HasNotRun的布尔字段,最初设置为true,以及Date字段。然后,我们使用HasNotRun字段作为分区键创建稀疏全局二级索引,以使所有灯具尚未运行,并使用Date作为排序范围键,并对其进行过滤。运行匹配后,HasNotRun字段将从项目中删除,因此该项目将从稀疏索引中删除。

但是,鉴于HasNotRun字段始终是true的单个值,此索引中的所有项目将始终位于单个分区中,这似乎不是最佳方式使用DynamoDB。

更好的方式?

如果有更好的方法来解决这个问题,我们很乐意听到它。我们知道它在那里!

1 个答案:

答案 0 :(得分:0)

您的解决方案实际上非常好。拥有单个密钥实际上并不像听起来那么糟糕,因为所有吞吐量都将转到该单个密钥。如果您有多个具有非统一查询分布的密钥,则会出现问题。只有一个键,你不会有这个问题。但是,如果您期望非常高的吞吐量,它可能会导致不同类型的问题:如果此GSI中的项目总数低于10GB,那么您将受到单分区吞吐量限制(我认为3000RCU和1000WCU)的限制。如果它超过10GB,那么将创建第二个分区,最大吞吐量将分别限制为6000/2000,依此类推。

您可以改进解决方案的一种方法是使用分片而不是布尔值。不是分配值“true”,而是分配从1到N的随机数(N取决于您的缩放计划,也可以动态调整)。您现在需要查询每个键的N个查询(您可以并行执行),然后合并结果。该解决方案不会遇到第一段中提到的问题。