外观
路线 B|C++ Linux 游戏服务端
B6|Game Server Architecture:登录、房间、匹配与同步
适用基础: B2~B5 目标: 能把玩家、房间和游戏状态放入明确的权威服务模型。
一、服务边界
text
Login:身份和令牌
Gateway:连接、协议和路由
Game:玩家状态和玩法规则
Room/Match:匹配与房间生命周期
Chat/Ranking:独立可扩展能力边界按状态 owner 划分,不按“代码方便”共享可变对象。
Login 的令牌证明身份,Gateway 维护连接和路由,Game 保存长期在线业务状态,Room 保存短生命周期对局状态,Match 只负责形成匹配结果。把所有功能拆服务并不天然更好;当团队和负载不足时,清晰模块化的单体比大量 RPC 更容易保证一致性。
二、玩家 Session 与存档
登录令牌、连接 session、玩家状态和持久化版本必须分开。断线重连要防止旧连接写入新状态,存档更新使用版本或乐观锁检测覆盖。
玩家在线状态通常由某个 Game 实例独占,Gateway 只保存路由。顶号、重连和迁移都要通过版本递增切断旧连接;旧异步回调必须携带旧版本并被拒绝。存档是长期事实,在线对象是工作副本,两者需要明确保存点和崩溃恢复策略。
三、房间状态机
text
Waiting → Matching → Ready → Playing → Settling → Closed每个转换写明触发者、超时、可重入性和持久化动作。房间关闭必须清理玩家引用、Timer、广播队列和匹配索引。
房间内部常采用单线程/Actor 式 owner,让同一房间事件串行处理,减少锁和状态竞态。不同房间可以分布在多个线程或进程。跨房间操作不能直接共享对象,应通过消息和版本化结果交互。
四、状态同步与权威性
帧同步传输输入并要求各端确定性,适合规则固定但对浮点、随机数和版本一致性敏感;状态同步传输服务器权威快照或增量,客户端可预测和插值,但要处理校正、快照丢失和带宽。客户端是不可信的,服务器验证输入、时间、资源和频率。选择同步模型要结合玩法、延迟、作弊面和回放需求。
五、匹配与排行榜
匹配队列要有超时、取消和重复请求处理;排行榜要定义分数事实、并发更新、分页快照和作弊检测,不能把 Redis 排序结果直接当永久事实。
匹配不是只按分数排序,还要在等待时间、地区延迟、队伍结构、段位范围和重复对手之间取舍。等待越久可以逐步放宽条件,但必须记录匹配版本,避免取消后旧结果仍然建房。
排行榜需要区分实时榜、结算榜和历史榜。实时榜可使用 Sorted Set,结算时需要快照或版本冻结,奖励发放使用幂等批次;否则分数在分页或结算期间变化会造成重复和遗漏。
六、房间结算与恢复
房间状态机必须明确谁拥有状态、哪些转换幂等、超时后如何结算、进程重启如何恢复。结算使用房间版本或结算幂等键,避免重复发奖;玩家断线不一定立即离房,取决于重连窗口和玩法语义。
七、练习与答案
1. 为什么结算必须幂等?
网络重试、进程恢复或客户端重复提交都可能触发多次;幂等键和结算版本保证奖励、扣费只应用一次。
2. 客户端预测能否改变服务器权威?
不能。预测只是表现优化,服务器仍验证输入并发布权威结果。
八、阶段输出
提交服务边界图、玩家/房间状态机、协议版本、断线重连时序和非法输入测试报告。
