#467·colyseus

强制实现房间 ID 的唯一性

作者: jldinh创建于 2021年10月29日更新于 2026年4月5日
标签:rocket: feature🏟 matchmaking

重现步骤 (对于错误)

  1. 设置一个包含 2 个服务器和一个 colyseus 代理 (Redis 存在和 Mongo 驱动) 的 colyseus 集群
  2. 创建一个带有过滤器的房间,参考 https://docs.colyseus.io/colyseus/how-to/password-protect-room/ 中的步骤 1
gameServer
  .define("battle", BattleRoom)
  .filterBy(['password'])
  1. BattleRoomonCreate 中,分配自定义 roomId
async onCreate(options: any) {
  this.roomId = options.password;
}
  1. 从多个客户端同时使用 joinOrCreate, 使用相同的 password
  2. 创建了多个具有相同 ID 的房间,这至少是对客户端方法 joinBy 的一个问题。即使我按照创建日期升序排列房间,客户端仍然会被分到多个房间中。

上下文

我试图创建具有与另一项服务提供的 ID 相匹配的固定 ID 的房间,但这似乎破坏了 joinOrCreate。这似乎是由于在寻找合适的房间时出现的竞争条件,该条件检查是否有可用的房间,然后创建一个。如果同时处理两个请求,将创建两个房间。 我尝试使 MongoDB 中的 roomId 索引唯一,但由于 colyseus 服务器没有适当处理数据库错误,因此我没有进一步调查此问题。 在我看来,我们需要以下两点之一:

内容来源: colyseus/colyseus