首页 > 代码库 > 空中换心

空中换心

最近一周在做一件非常刺激的事情,刺激到不想再干第二遍了T_T。。。还有一个月就要内测的时候,换掉服务器架构,而且还要同时做需求,无异于对空中的飞机换引擎啊

 

8月末的时候,老大开了个会,服务器架构要重构一下,将以前的逻辑分服改成物理分服。之前的架构里,开新服很简单,但因为是大服结构,任何一个逻辑服挂了,都会影响其他服的玩家,隔离性不够高。同时,做单服的服务时,处理逻辑需要考虑不同服的影响,添加了额外的心智负担,不容易做对。于是,架构决定改成这样:

 

技术分享

 

每个game是一个进程,这样任意game挂掉都不会影响其他服务器了,适合策划们大量开新服,每周清理关停老服的洗量玩法。设计的时候,希望各个进程之间是松散的结合到一起的,甚至center都没有直接call到game的接口。取而代之的,是一个消息队列。game上线之后,就在center上创建一个消息队列,center需要发消息给game,就丢一个消息到队列里。最终的目标是,center即使短暂挂掉,也能快速重启,只造成短时间新玩家无法登录,已经登录游戏的玩家应该能继续游戏。同时,center的结构足够简单,几乎不会挂掉。

 

上周老大和另外一位同事做了一周,这周就决定切换到新架构来了。因为我的工作主要是写逻辑,基本都是在玩家身上,挂在agent上的玩法,所以改动的地方不多,修好聊天和邮箱服务即可。于是,一边消化策划的新需求,一边参与迁移新架构。实际结果喜忧参半,喜的是新写的逻辑因为都在agent上,可以完全复用;忧的是时间非常紧迫,然后还要处理一些迁移架构带来的bug。幸而最后还是活过来了XD

 

关于这次架构的变动,也跟其他组的同事讨论过,不过被吐槽说跟skynet的master-slave架构没什么区别^_^ 回来仔细想了一下,感觉还是可以辩护一下的。第一点,之前用的master-slave,没有指定slave具体负责的逻辑服id,每个slave都是相同的,都有可能被不同服的客户端连上。当然,这个问题可以改掉,改成跟现在架构类似的。第二点,之前的master挂掉之后,slave虽然不会马上挂掉,但是公会之类的服务是放在特殊的slave上的,也会立即失效,而新架构都在一个进程内,还能继续工作。归根结底,是因为master-slave被认为是一个稳定的整体,skynet不会处理内部的网络连接断开的。如果换成cluster,用消息队列来连接,相对来说容错性就更高了

 

策划们最近学聪明了,也要搞隔离式设计了。出了十几二十种资源,基本都不互通,很多资源都是某个功能专有的,比如这种资源专用于升装备指定属性,那种资源用来升英雄特定属性。每种资源的投放到回收都隔离开来,不会相互影响。做设计的时候就可以不怎么动脑了,做错了大不了直接关掉这个系统,不需要为之前挖的坑埋单。对于这种快餐式设计,只能无奈叹气。程序做起来没什么难度啊,多一种资源不就多记一个变量。只不过这种水平扩展的系统,能不能给玩家带去更有层次感的游戏体验,个人对此表示怀疑。

空中换心