我正在实施社交象棋游戏。每个用户都可以创建一个新游戏,他们将等到系统找到适合他们的对手。
用户创建游戏时,他们会指定约束条件:他们要玩的颜色以及对手的最低国际象棋等级。
对手可以匹配也可以不匹配。 例如,以下两个对手将匹配:
// User 1 with rating 1700 // User 2 with rating 1800 // creates this game // creates this game game: { game: { color: 'white', minRating: 1650 minRating: 1600 } } // User did not specify a preferred color, // meaning they do not care which color to play
因此,如果用户1是系统中的第一个用户并创建了他们的游戏,他们将等待。用户2创建游戏后,应立即将其与用户1进行匹配。
另一方面,以下两个对手将不匹配,因为他们两个都想打白棋。在这种情况下,双方都应该等到别人用color: 'black'(或未指定颜色)创建minRating符合要求的游戏。
color: 'black'
minRating
// User 1 with rating 1700 // User 2 with rating 1800 // creates this game // creates this game game: { game: { color: 'white', color: 'white' minRating: 1600 minRating: 1650 } }
我的关注点与成千上万的用户同时创建新游戏的场景有关。如何确保在不造成死锁的情况下匹配对手?也就是说,当用户1,用户2和用户3试图同时寻找对手时,我如何防止这种情况发生,它们的匹配算法将返回用户99。他们?
您将如何使用Firebase的功能来实现这样的匹配系统?
在NoSQL环境中,这是一项艰巨的任务,特别是如果您要匹配多个字段
在您的情况下,我将按颜色设置一个简单的索引,并在该颜色内存储对游戏的引用,优先级设置为minRating。这样,您可以通过首选颜色(优先级为minRating)查询游戏。
indexes: { color:{ white:{ REF_WITH_PRIORITY_TO_RATING: true }, black:{ REF_WITH_PRIORITY_TO_RATING: true } } }
如果您想在比赛打开游戏时获取信息,请执行以下操作:
ref = new(Firebase)('URL'); query =ref.child('color_index/white/').startAt(minPriority); query.on('child_added',function(snapshot){ //here is your new game matching the filter });
然而,这会如果用于过滤例如游戏引入多个领域变得越来越复杂dropRate,timeZone“gamesPlayed”等等......在这种情况下,你可以嵌套索引更深:
dropRate
timeZone
indexes: { GMT0: { color:{ white:{ REF_WITH_PRIORITY_TO_RATING: true }, black:{ REF_WITH_PRIORITY_TO_RATING: true }, } GMT1: { // etc } }