我正在开发一款要求玩家配对的游戏,即将2名玩家放入一个战斗室。
尽管在线游戏中的玩家很少,但这不是问题,但是如果我们假设一次在线有100万名玩家都在尝试配对的情况,那么画面就会变得更加复杂。
假设遵循以下流程
我的第一个直觉是
但是,鉴于我们有1,000,000名玩家将执行此操作,因此我在这里看到了很多问题。例如,在执行第2步并将房间设置为“活动”时,我们可能会在这些请求解决期间将更多的玩家推入其中?
答案 0 :(得分:2)
如果要处理并发,我认为您应该使用事务来执行此操作(将玩家添加到房间中)。这样,您可以确保在添加播放器之前检查房间是否仍处于打开状态。如果2位玩家同时开始配对并找到相同的房间,那么只有一位玩家会被添加到该房间 https://firebase.google.com/docs/firestore/manage-data/transactions
答案 1 :(得分:0)
据我了解,我可以建议的一种简化方法是让用户自己拥有状态,而不是调用云函数来创建房间
使用户状态为活动,在线,离线。当用户按下播放时,将其状态设置为活动状态。
调用查询以获取状态== active,限制为5(示例)的用户。
如果成功,则开始交易以与第一个用户匹配,如果失败则将状态更改为同时播放(如果您与其他人匹配,或者您尝试与之匹配的玩家)则检查下一个玩家。
如果在此期间您应该始终观察自己的状态(如果因为其他人匹配您而变成了比赛状态),则直接进入游戏。