本篇围绕服务器调度核心逻辑进行剖析,重点讲解用户连接过程、房间分配机制、服务端并发策略及常见性能瓶颈优化。适用于具备中高级 C++ 后端开发经验的读者,覆盖网络会话池、逻辑服调度器与房间生命周期管理等关键模块。
整体系统采用模块化架构设计,主要包含:
网关服(Gateway Server):负责用户初始连接与心跳管理
中心调度服(Center Server):负责分配逻辑服与房间ID
逻辑游戏服(Game Logic Server):每个房间运行的具体逻辑服务实例
数据库服(DB Server):负责数据落盘与活动查询
如下图示意:
Client -> Gateway -> Center Server -> Game Logic Server
-> DB Server
整个流程涉及多个模块间的数据流与状态切换:
void OnClientConnect(Socket* client) {
AuthRequest req = ParseAuth(client);
if (ValidateToken(req.token)) {
BindSession(client, req.uid);
ForwardToCenter(req);
}
}
RoomInfo CenterServer::AssignRoom(int uid) {
int roomId = roomManager.GetAvailableRoom();
LogicServer* target = scheduler.SelectLeastLoad();
return { roomId, target->ip, target->port };
}
SendToClient(uid, { roomId, ip, port });
房间对象 Room 在逻辑服内部生命周期如下:
class Room {
public:
void Init(int roomId, const RoomConfig& cfg);
void Tick(); // 每帧逻辑处理
void OnPlayerEnter(Player* p);
void OnPlayerLeave(Player* p);
void Shutdown();
private:
std::vector players;
FishGroupManager fishMgr;
Timer tickTimer;
};
房间在 Tick()
中控制鱼群生成、子弹碰撞、结算等行为,退出人数为0后5分钟销毁:
if (players.empty() && GetIdleTime() > 300) Shutdown();
为避免某逻辑服压力过大,中心服根据实时房间数量选择目标逻辑服:
LogicServer* Scheduler::SelectLeastLoad() {
return *std::min_element(logicServers.begin(), logicServers.end(),
[](auto* a, auto* b) { return a->roomCount < b->roomCount; });
}
实现房间在低峰期进行逻辑服迁移,需序列化房间状态:
SerializedRoom Room::SerializeState();
void Room::RestoreFromState(const SerializedRoom& state);
使用多线程安全会话池控制最大连接数:
std::unordered_map sessionPool;
std::mutex sessionMutex;
所有服务使用统一协议头:
[uint16_t Length][uint16_t CmdId][Payload]
通过 Prometheus + Grafana 实现对各服务器在线人数、负载、房间数量等指标采集:
Prometheus::Gauge("logic_server_rooms", roomCount, {"logicId", logicId});
日志建议使用分级写入:INFO / WARN / ERROR,异常行为写入独立告警日志:
log_error("room crash: %d", roomId);
本篇完整介绍了集结号海螺捕鱼在高并发环境下的服务器调度机制。涵盖网关认证、中心服分配、房间生命周期与负载迁移等复杂逻辑。希望对有志于构建大型互动娱乐平台的开发者有所启发。