去年从传统软件公司辞职,下定决心转互联网,由于对游戏的热爱,去了一家游戏公司,待了将近10个月,参与开发了一款动作卡牌手游,游戏最终也上线了。最近抽空写写过去对游戏后端的一些感想吧。最近又去另外一家游戏公司,参与开发一款MMO手游。准备开始从动作卡牌手游谈到MMO手游,也算是对游戏开发的一些感悟。
动作卡牌游戏,相对而言,时延性要求没有那么高,所以架构没有那么复杂,不过也是值得学习的。本文重点介绍卡牌游戏的架构。
整个后端架构分成5个主要模块,后面新增2个模块,主要用于跨服对战。
整个游戏的架构如上图所示。
每个区服对应这样一组进程:
loginserver、dbserver、gameserver、worldserver,gmserver,然后matchserver和pvpserver用于跨服系统。
各个进程间通信使用socket,通信协议采用protobuf,对消息包进行序列化和反序列化。账号数据以及打点日志信息存放在mysql,角色数据存放在redis中。这边这样设计的原因是,角色数据要求时延性高,并且是经常写入,因此采用redis可以提高吞吐量,而账号数据以及日志信息是基本不变动的,而且采用mysql基本满足需求,并且稳定性比较高,还方便运营后台维护。这边可以优化的地方是可以把日志单独拎出来,做成一个日志服务器。
下面简单介绍下各个模块功能,后续会继续分析这样设计的意义,以及实现的功能。
loginserver:登录服务器,主要有二种,第一种是中心登录服,所有的客户端连接这个服务器获取服务器列表信息,第二种是普通登录服,用于选择区服之后的登录验证。
gameserver:逻辑服务器,管理游戏的基本逻辑,包括各个基本系统。
worldserver:世界服务器,管理游戏的一些数据,包括门派数据,竞技场,世界boss等数据。
dbserver:数据库服务器,主要管理mysql,包括登录验证以及日志打点入库。
gmserver: GM服务器,一般只有一个(可做成多节点),主要用于运营后台的管理,包括邮件的发送,道具发
送等等功能。
matchserver:一般只有一个(可做成多节点),主要用于跨服系统的匹配,以及监控pvpserver服务器。
pvpserver:用于管理跨服战场,和gameserver采用同样的代码,只是初始化不一样。
这个动作卡牌游戏的架构基本上是这样,主要是单服的人数不会太高,所以这样的架构基本上能满足实际需求。
这个游戏单区服最高在线人数一般不会超过5000,所以这样的设计完全合理。如果是MMO游戏,架构上将会有很大
的不同。后面将会对一些比较重要的地方如登录流程、网络底层、战斗系统、跨服系统等进行重点分析,并且给出
一些优化方案。