高效的火柴配对员

时间:2019-02-09 18:34:39

标签: firebase google-cloud-firestore google-cloud-functions

我正在开发一款要求玩家配对的游戏,即将2名玩家放入一个战斗室。

尽管在线游戏中的玩家很少,但这不是问题,但是如果我们假设一次在线有100万名玩家都在尝试配对的情况,那么画面就会变得更加复杂。

假设遵循以下流程

enter image description here

我的第一个直觉是

  1. 当玩家单击“播放”时,呼叫云功能会检查“开放”战斗室是否存在。
  2. 如果有一个空位,则在其中放置玩家并开始战斗或将战斗设为活动状态。
  3. 如果没有开放的房间,我们会创建一个新房间,然后等待其他玩家加入。

但是,鉴于我们有1,000,000名玩家将执行此操作,因此我在这里看到了很多问题。例如,在执行第2步并将房间设置为“活动”时,我们可能会在这些请求解决期间将更多的玩家推入其中?

2 个答案:

答案 0 :(得分:2)

如果要处理并发,我认为您应该使用事务来执行此操作(将玩家添加到房间中)。这样,您可以确保在添加播放器之前检查房间是否仍处于打开状态。如果2位玩家同时开始配对并找到相同的房间,那么只有一位玩家会被添加到该房间 https://firebase.google.com/docs/firestore/manage-data/transactions

答案 1 :(得分:0)

据我了解,我可以建议的一种简化方法是让用户自己拥有状态,而不是调用云函数来创建房间

  1. 使用户状态为活动,在线,离线。当用户按下播放时,将其状态设置为活动状态。

  2. 调用查询以获取状态== active,限制为5(示例)的用户。

  3. 如果成功,则开始交易以与第一个用户匹配,如果失败则将状态更改为同时播放(如果您与其他人匹配,或者您尝试与之匹配的玩家)则检查下一个玩家。

  4. p>
  5. 如果在此期间您应该始终观察自己的状态(如果因为其他人匹配您而变成了比赛状态),则直接进入游戏。