Database Azure上的游戏记分板

Database Azure上的游戏记分板,database,azure,storage,azure-storage,azure-data-lake,Database,Azure,Storage,Azure Storage,Azure Data Lake,你能给我推荐一个在Azure云上存储游戏分数的替代解决方案吗?我正在寻找一个管理的,运行成本低和易于上下扩展的存储选项 输入数据:{“玩家”:1,“分数”:10}(分数可能已经计算出来,无需汇总。) 应该可以选择进行两种类型的查询: 1.获取球员在记分板中的位置。 2.获得位置X和Y之间的位置(球员和得分) 在写入期间,应用程序无法判断球员在记分板中的位置-后端数据库解决方案应提供该信息,或者数据布局应允许快速计算所有球员之间的位置。 非实时精度是可以接受的 当前的后端技术选择:Azure We

你能给我推荐一个在Azure云上存储游戏分数的替代解决方案吗?我正在寻找一个管理的运行成本低易于上下扩展的存储选项

输入数据:
{“玩家”:1,“分数”:10}
(分数可能已经计算出来,无需汇总。)

应该可以选择进行两种类型的查询:
1.获取球员在记分板中的位置。
2.获得位置X和Y之间的位置(球员和得分)

在写入期间,应用程序无法判断球员在记分板中的位置-后端数据库解决方案应提供该信息,或者数据布局应允许快速计算所有球员之间的位置。 非实时精度是可以接受的

当前的后端技术选择:Azure Web App(.NET Core)、存储(表、Blob、队列)。
使用SQL server显然可以做到这一点,但我希望避免将SQL server带入技术堆栈。由于有多个web服务器,因此也不能将其保留在内存中


您知道如何使用任何其他Azure服务存储和检索此类数据吗?DocumentDB、Data Lake、任何其他?

如果您使用表,那么您的第一次查询很容易,您可以使用玩家id(玩家的唯一标识符,无论您选择什么)作为分区键,并且分数可以是同一实体的属性。当你想读回(你的查询1)时,你只需要用唯一的玩家id进行一个积分查询,然后得到分数

你的第二个问题有点棘手。您可能希望避免下载整个表,并在客户端执行内存内排序,这是客户端和表服务组合中最糟糕的

因此,这里需要选择一个不同的分区键来优化第二个查询。您可以做的一件事是创建一个范围桶,并获取该范围的唯一哈希。也就是说,如果你写的是一个位置为19的玩家,你选择的桶大小为50,这将进入你的第一桶位置在1-50之间的玩家。在将位置为19的播放器写入表之前,客户机中的facade(或适配器,无论您如何称呼它)代码层将检测到它进入第一个bucket,为该bucket生成一个散列,并使用为bucket 1-50生成的散列作为分区键,实际的player unique id作为其行键和其他属性将播放器写入表中

为bucket生成的哈希可能只是bucket下限和上限的哈希,等等。请确保使用加密哈希而不是Object.GethashCode,因为这可能会为完全相同的对象返回不同的哈希值,并且不应用于其目的

当您想要获得范围X和Y之间的所有玩家时,您需要查询那些您知道的覆盖该范围而不是整个表的分区。您将使用精确的分区键(代表bucket的散列值)查询分区,这样会更高效


在插入播放机时,您需要创建两个实体:第一个用于第一次查询,第二个用于第二次查询,并同时插入这两个实体。此过程也称为对数据进行非规范化,以针对不同的查询需求进行优化。希望这有助于理解如何使用Azure表对此进行优化

Azure表存储有利于存储纯数据,而且价格低廉且易于扩展。但对于复杂的查询来说,这并没有什么好处。如果表存储满足您的需要,您可以通过选择表存储来节省一些钱。价格从每GB/月4.5美分到12美分不等

Azure DocumentDB是一个分布式文档数据库。它比Azure表存储功能更强,但也更昂贵。价格:每GB/月25美分

Azure Data Lake Store是针对大数据分析工作负载的优化存储,我们经常使用它来批量、交互式、流式分析和机器学习数据,如日志文件、物联网数据、点击流、大型数据集

如果Azure表存储能够满足您的需求,那么最好选择它。根据您的描述,我建议您使用Azure表存储,并通过使用不同的分区键来优化查询。关于如何设计一个可扩展的性能表,下面的链接供您参考

获得球员在记分板上的位置

如果我们想要获得位置(排名),存储数据的最佳方法是使用score作为分区键。如果我们只知道当前玩家的id,我们需要在查询位置之前获得当前玩家的分数。要根据玩家id查询玩家,最好将玩家id设置为分区键,将游戏数据的另一个副本存储在Azure表存储中

获得位置X和Y之间的位置(球员和得分)

将分数用作分区键适用于此场景

总之,我建议您存储两个不同的游戏数据副本。一个是使用分数作为分区键,另一个是使用玩家id作为分区键


对于这两个问题,我都不知道职位

查询的结果数据是按分区键排序的。因此,结果计数是你的球员的位置(排名)


例如,将分数设置为分区键后,可以使用小于分数(例如10)的分区键来查询一系列实体,实体计数是分数为10的玩家的位置。

计算列表中位置的问题是排名(以及通常的窗口操作)当您的数据可以分布在多个服务器上时,很难做到这一点。随着数据的增长,这将成为一项昂贵的操作,而且扩展性不好

Data Lake确实支持窗口功能,包括。您需要使用一些有代表性的数据对此进行一次良好的测试,以了解性能如何


另一个选项是预校准