5

我目前有一个使用 mongodb 作为数据库的社交游戏应用程序。我的问题是,如果我想创建积分和徽章系统,有什么建议。成就/徽章的业务逻辑可能会变得非常复杂并且非常临时,因此实时授予徽章似乎效率不高。我正在想象将跟踪的操作添加到某处的队列中,即 Amazon SQS,或者仅使用用户的活动提要作为队列,并让另一个离线工作进程通过并仅处理每个操作/活动的影响,以查看阈值是否为任何特定的徽章都会被划掉。

我对这种方法的担心是,徽章查询似乎会变得非常密集,而且我还必须跟踪大量的操作。我可以设想的成就包括诸如过去 4 周每周获得第二名的人的徽章,或者在 50 个州中的每一个州都有朋友的人的徽章……等等……

这种类型的东西有更优雅或久经考验的方法吗?除了 mongo 之外,为成就/活动提要/排行榜使用另一个数据库,创建 mongo/其他 db 混合环境是否有意义?

Redis、Neo4J 或只是普通的旧 SQL Server 等选择是混合解决方案的好选择吗?我喜欢 Mongo,所以它将继续作为我们的主要数据库,但很想知道添加另一个数据库是否会有所帮助。

4

2 回答 2

3

这是在数据库上运行 map reduce 的好选择。您可以不定期地运行它们,将它们用于所需数据的离线计算。

http://www.mongodb.org/display/DOCS/MapReduce

您可以使用其他工具来执行此操作,但在您的摘要中,我看不出在此阶段增加复杂性的任何令人信服的理由。我会探索 map reduce,尝试一下,如果它不能满足您的需求,请扩展您的选择。但在那个时候,你至少会发现具体的瓶颈,如果有的话。

于 2011-11-04T17:13:13.720 回答
0

只是关于使用像 Neo4j 这样的图形数据库的一些注意事项。因为你的徽章信息总是?为具体用户查询这些是本地查询而不是全局查询。

因此,如果您可以将您的域建模为对象网络(可能已经是)并将您的徽章逻辑表达为从用户开始的一组遍历图形查询,那么它可以在不持久化它们的情况下工作,因为本地图形查询足够快,无论数据集大小。

最简单的事情是创建一个有时间限制的 PoC,看看它是否适合你。通过将您的用户 ID 存储在 graph-db 索引中并作为节点上的属性来交叉连接两个商店应该相当容易。您可以在提交/保存挂钩上或异步同步数据库。也许将其他“社交网络”数据也移动到图表中并将游戏数据+文档保存在 mongodb 中是明智的。

于 2011-11-07T00:12:05.120 回答