强制实现房间 ID 的唯一性
作者: jldinh创建于 2021年10月29日更新于 2026年4月5日
标签:rocket: feature🏟 matchmaking
重现步骤 (对于错误)
- 设置一个包含 2 个服务器和一个 colyseus 代理 (Redis 存在和 Mongo 驱动) 的 colyseus 集群
- 创建一个带有过滤器的房间,参考 https://docs.colyseus.io/colyseus/how-to/password-protect-room/ 中的步骤 1
gameServer
.define("battle", BattleRoom)
.filterBy(['password'])- 在
BattleRoom的onCreate中,分配自定义roomId
async onCreate(options: any) {
this.roomId = options.password;
}- 从多个客户端同时使用
joinOrCreate, 使用相同的password - 创建了多个具有相同 ID 的房间,这至少是对客户端方法
joinBy的一个问题。即使我按照创建日期升序排列房间,客户端仍然会被分到多个房间中。
上下文
我试图创建具有与另一项服务提供的 ID 相匹配的固定 ID 的房间,但这似乎破坏了 joinOrCreate。这似乎是由于在寻找合适的房间时出现的竞争条件,该条件检查是否有可用的房间,然后创建一个。如果同时处理两个请求,将创建两个房间。
我尝试使 MongoDB 中的 roomId 索引唯一,但由于 colyseus 服务器没有适当处理数据库错误,因此我没有进一步调查此问题。
在我看来,我们需要以下两点之一:
内容来源: colyseus/colyseus