【发布时间】:2014-09-21 23:29:54
【问题描述】:
我正在实现一个社交国际象棋游戏。每个用户都可以创建一个新游戏,他们会等待系统为他们找到对手。
当用户创建游戏时,他们会指定约束:他们想玩的颜色,以及对手的最低国际象棋等级。
对手可以匹配也可以不匹配。例如,以下两个对手将匹配:
// 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创建符合要求的游戏。
// 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 时,如何防止出现这种情况。如何从这种情况中恢复,仅将用户 99 分配给其中一个他们?
您将如何利用 Firebase 的强大功能来实现这样的匹配系统?
【问题讨论】:
-
你应该把你的问题分成两个问题,如何找到最佳对手,以及如何制作实际的技术匹配系统来避免死锁问题。
-
听起来您需要在主
users节点或专用usersByRating或usersByRatingAndColor中使用用户的评分和颜色作为他们的优先级节点。有了这些,您可以使用startAt和endAt来查找具有相似评分的用户。为防止启动多个相互冲突的游戏,您可以使用transaction。
标签: algorithm firebase firebase-realtime-database nosql