如何使用 nosql 构建成就和徽章

Posted

技术标签:

【中文标题】如何使用 nosql 构建成就和徽章【英文标题】:how to architect achievements and badging with nosql 【发布时间】:2011-12-21 23:16:30 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于如何使用 nosql 构建成就和徽章的主要内容,如果未能解决你的问题,请参考以下文章

成就/徽章系统

Google Play 商店中未显示排行榜和成就徽章

Google Play 商店:我的应用页面不显示排行榜和成就图标/徽章

成就/徽章的架构

Rails“徽章”类型插件/教程?

用于构建成就系统的现代 Ruby/Rails 工具