如何使用DynamoDB中的100万玩家建模高分并防止热键?

时间:2014-10-22 18:40:21

标签: amazon-web-services amazon-dynamodb

我想将游戏结果存储在DynamoDB表中。每个用户都有一次尝试,并以他的分数进入表格。

比赛结束后我必须显示排名。因此,我需要按分数排序的所有用户条目。

我的第一次尝试看起来像这样:

Game | UserID | Score
0    | 101    | 222
0    | 202    | 44
0    | 303    | 345

游戏哈希键得分 范围键

要获得排序的排行榜/高分,我只需要提交一个类似的查询:

Hash key == 0

尼斯!它也适用于部分排名;我只需要使用范围键和查询限制。

据我所知,我的游戏哈希密钥被视为"热键",这可能导致瓶颈和数据流。

我估计有一百万个具有相同散列键的条目。

Funnily亚马逊还提供了一些使用相同方法的教程(GameID作为哈希键)。

这是一种有效的方法还是有其他解决方案,可以传播哈希键并且仍然有一个排序分数?

谢谢!

1 个答案:

答案 0 :(得分:1)

亚马逊的例子是假设有许多不同的游戏,因此写入分布在不同的散列键上。听起来你说你只有一个或者只有极少数的游戏ID,所以你描述的表结构对你来说可能是一个问题。还要记住"对于具有本地二级索引的表,项目集合大小有限制:对于每个不同的哈希键值,所有表和索引项的总大小不能超过10 GB。根据您的项目大小,这可能会限制每个哈希值的范围键数量#34; (AWS Developer Guide: Limits)。

你怎么能改善这个?您可以将分数分段为范围,并将范围添加到散列键。例如:

Game+ScoreBlock | Score | UserID
0+0             | 44    | 202
0+2             | 222   | 101
0+3             | 345   | 303

Game + ScoreBlock是你的哈希键,分数是你的范围键。这里ScoreBlock = Floor(得分/ 100)但您可以根据您的得分范围选择合适的除数。要查询此信息,您可以单独跟踪当前存在的最高分数块。然后,要获得从最高到最低的分数,您将查询最高分数块,然后查找下一个最高分等等。实际上,你会在找到N个最高分之后停下来,这样就不会听起来那么糟糕。