深入探讨游戏服务器架构设计,尤其是支持百万级同时在线的全区全服游戏。这类设计并不复杂,关键在于抓住几个要点。在若干年前的项目中,我们为一款休闲游戏构建了架构,目标是实现百万以上同时在线,并能在30分钟内扩展至百万用户。
在经历了多轮技术设计评审后,游戏成功上线,最高同时在线人数举拍稳定在30万左右,尽管未达到预期的百万级别,但系统运行平稳,展现出强大的支撑能力。从这些经验中,我们意识到,即使是大作如原神或鸣潮,虽然用户基数庞大,但实现起来并非不可逾越的难题。特别是开放世界游戏偏单机向,对服务器负载的影响相对较小。而对于王者荣耀这样接近千万级的多人在线战斗竞技(MOBA)游戏,核心挑战在于网络同步,而非服务器规模。
尽管互联网应用的规模远超游戏,但游戏正简羡服务器设计有自己的难点。对于延迟敏感度高以及部分服务器必须保持状态的特点,游戏服务器架构与互联网应用有所不同。本文将聚焦于这类游戏服务器的架构搭建,着重于实现水平扩容、高可用性、容灾策略,并提供自建与公有云部署方案。
针对大型多人在线(MMO)等大世界游戏的规模扩展问题,可以参考另一篇文章《游戏服务器研究二:大世界的 scale 问题》。
全区全服架构详解
全区全服游戏指所有玩家在一个大平台内共同游戏,无需咐族选择特定区服。战斗模式通常是“开房间式”,匹配到一定人数(可能为1人)即开始一局游戏。此类游戏如社交网络(sns)游戏、IO类游戏,均属于全区全服类型。
市面上几乎所有全区全服游戏都可以归类为开房间类型,区别仅在于房间人数的多少。例如,开放世界游戏在PVE模式下可视为单人房间,PVP模式下则为多人房间;棋牌类游戏则为多桌多人游戏;MOBA类游戏如王者荣耀,多人组队对战。
早期的棋牌游戏架构采用房间+桌子模式,整个游戏由多个房间、每房间多个桌子组成,每桌坐定人数。然而,当前已无需如此设计,统一抽象为房间即可,便于负载均衡。
总体架构
面对百万级玩家,关键在于水平扩容与负载均衡,确保架构的各个组成部分均能横向扩展。此外,还需实现高可用性和容灾能力。
具体部署方案包括自建与公有云两种。
架构图
以下为实际可用的服务器架构示意图。
工作流程
以“玩家登录并战斗”为例,流程如下:
客户端通过SDKSVR完成SDK登录授权,获取token。
客户端以token作为凭证连接PlazaSVR,拉取游戏数据。
客户端发送加入战斗请求至PlazaSVR,PlazaSVR转发给MatchSVR完成匹配。
从BattleSVR集群中选择一台承担战斗任务,客户端连接该BattleSVR进行游戏。
架构说明
架构设计中,网络负载层、数据层、游戏服务层等都应支持水平扩容。接下来详细阐述各个组成部分的功能与实现细节。
网络负载层
该层为游戏服务层的SDKSVR集群、PlazaSVR集群提供负载均衡功能。
游戏服务器层
由自研游戏服务器构成。
服务器作用与特性
分别介绍各服务器的主要作用、特性与实现细节。
PlazaSVR实现细节
避免重复登录:用户可连接任意PlazaSVR接入游戏,通过Redis记录登录服,避免同一用户登录多个服务器。
自我保护:PlazaSVR通过LVS负载均衡,设定合理的人数上限,防止过载。
是否缓存数据:一般不缓存数据,但在特定游戏类型或玩法下,可能需要缓存,确保数据修改只在PlazaSVR端,核心数据立即回写数据库。
BattleSVR实现细节
直连或中转:延迟敏感型游戏应直接连接BattleSVR,以减少延迟;延迟不敏感游戏可由PlazaSVR中转数据。
TCP或UDP:延迟敏感型游戏推荐使用UDP,如Moba、FPS等,可利用高效UDP实现。
容灾:BattleSVR作为有状态服务器,难以实现容灾,但针对特定场景(如棋牌、卡牌游戏)可考虑使用内存数据库(如Redis)实时存储场景状态。
MatchSVR实现细节
负责玩家匹配,将玩家放入池中,匹配n个玩家至特定BattleSVR进行游戏。工作时将匹配请求写入内存数据库,并按频率从中取玩家匹配。
实现高可用与容灾,采用主备模式部署,依赖etcd进行选举,主宕机时备服务器接管。
数据层
包含MySQL、Redis、ETCD、数据仓库等组件。ETCD用于服务发现与主备选举,MySQL与Redis主要解决分片问题。
MySQL
实现分片有多种方案:业务层、中间件或数据源,推荐使用中间件或数据源方式。
Redis
用于存储运行时数据、大型排行榜与缓存数据,其中登录服记录与排行榜需持久化。
性能与故障排查
全面的压力测试与监控系统是确保服务稳定的关键。上线前接入监控工具,如Prometheus,关注硬件指标及业务指标,如数据收发量、服务在线人数等。
糟糕的设计
列举了一些被认为是不理想的架构设计,如使用“数据库服务器”作为媒介、完全使用Redis缓存核心玩家数据等。
推荐阅读
深入理解游戏服务器设计,推荐阅读相关专业文章。
参考文献
[1] skywind3000. kcp. Available at github.com/skywind3000/....
[2] 云烟成雨TD. ShardingSphere 5.x 系列【3】分库分表中间件技术选型. Available at blog.csdn.net/qq_434378..., .
[3] 华为云. 分布式数据库中间件 DDM. Available at huaweicloud.com/product....
[4] 腾讯云. TDSQL 水平分表. Available at cloud.tencent.com/docum....