我正在实现一个社交棋类游戏。每个用户都可以创建新的游戏,他们需要等待系统找到对手。
当用户创建一个游戏时,他们需要指定一些限制条件,例如:他们想玩哪种颜色,并且对手的最低棋力。
对手可以匹配或不匹配。例如下面的这两个对手是匹配的:
// 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
} }
我关注的是当成千上万的用户同时创建新游戏时的情况。如何确保我在匹配对手时不会出现死锁?也就是说,如何防止 User 1、User 2 和 User 3 同时尝试找到对手并且他们的匹配算法返回了 User 99 的情况。如何从这种情况中恢复,并将 User 99 分配给其中一个用户?
您会如何利用 Firebase 的强大功能来实现这样的匹配系统?
users
节点中或专门的usersByRating
或usersByRatingAndColor
节点中实现。有了这个,您就可以使用startAt
和endAt
查找具有相似评分的用户。为了防止启动多个冲突的游戏,您需要使用transaction
。 - Frank van Puffelen