两年的项目开发一点小心得

        从11年8月份到现在,一直在参与开发一款网页游戏,我负责后端程序的开发,由java实现,基于mina框架。是现成的其他项目精剪后的框架给我们用的,我们只要在上面写写逻辑就差不多了。经历了一年多的开发,去年10月份公司内开始测试,年底正式对外测试并且收费,年后到现在就处于调整优化推广期了。2年的时间这么长,总要写点什么,于是这就开始写了。

       在之前,我都是在基于webhttp的框架上写代码,包括之前一年做的社交游戏,现在要写基于socket的框架写代码,所以还是有些不同的。http下,基本上就是请求处理,每个http请求都是同步处理的,处理完成一次性返回结果,无法主动推送内容给客户端,只能是客户端不停的轮训。所以并发难上去,实时性达不到,性能也有点逊色,但是编码简单,上手容易。现在的公司早先一款页游,也是基于http的,但是游戏需要大量实时的消息推送,因此又架了个实时服务器,客户端socket长连接实时服务器,逻辑服务器把内容推送到实时服务器再由实时服务器广播给flash客户端,这样就比较麻烦费劲。做交互性,实时性的游戏,socket还是最合适的。

      在socket长连接下,客户端和服务端建立一个长连接,服务端可以随时把消息内容推送给客户端,客户端也可以随时发送给服务端,不需要不停的建立断开连接,节省了部分资源,最重要的,实时性得到很好的实现。缺点是,一台服务器的总连接数是固定的,到达一定数目后就会有瓶颈,好在我们的游戏要求一台服不需要太多的人,不断的开服是游戏的盈利之道。

       mina是基于消息处理的,需要定义一个消息处理器,消息解码和编码器,我们的游戏框架就基于此。消息处理器负责将收到的消息放入消息分发队列,消息分发队列根据消息类型投放消息,如果是用户消息就放到用户的消息队列里,如果是系统消息等则放到一个主消息处理队列,它是按顺序执行的,基本上除了用户在场景里,其他消息都由主消息队列处理。消息解码齐负责将收到的字节码翻译成一个java消息对象,然后给消息处理器。消息编码器则负责把一个java消息对象翻译成一个字节数组给mina发送给客户端。

       所以我们的工作内容主要是,定义消息,编写消息逻辑处理代码,发送消息给客户端,保存数据到数据库。就这样,我们编写了游戏的全部业务逻辑,我本人完成了明雷、装备、仓库系统,以及多人在线副本活动等模块。对这个框架也是从不熟,到能用,到熟悉用的阶段。

        上线后,出现过很多问题,比如升级时加经验,偶尔会加为负值,原因是并发导致的。一个boss被多个人打死,同样是并发导致的。一艘船被很多人抢了,还是并发导致的。是怎么解决的呢?信号量,消息队列,synchronized。因为我们的游戏一个场景内消息是按顺序处理的,不同场景则不再同一个线程,所以会产生并发情况。根据不同情况决定不同方法,比如打世界boss,我把所有人攻击的消息放到一个队列按顺序处理,由于战斗过程是异步的,所以在前一场战斗结束后才会进入下一场战斗,从而保证了顺序,避免被多人打死的情况。比如抢船,定一个了一个唯一的信号量,先抢的人取得该信号量,则他战斗未结束前未释放前,任何人都取不到该信号量从而无法抢,避免了被多人抢的情况。

        除了并发问题,我们在压力测试的时候出现过线程池都卡死都处于等待状态,发现登录过程特别慢,于是开始优化,对于登录流程,新注册用户减少部分sql查询。但是效果不明显,后来发现是因为mysql为定义索引导致的,开发时数据量上没发现异常,测试时数据量多就会卡了。我们框架用的是hibernate3,无法自动生成索引,于是我们升级为hibernate4,这个问题就解决了,登录速度很快了。在这个过程,我们改动了线程池,把登录的,战斗的,保存数据库的,其他逻辑处理的线程池都分开了,以为这会加快处理速度,其实这是在给自己挖坑!

        我们的线程池有一个公用的和一个根据角色id分配的线程池,公用的线程池只要有空闲线程,放进去的线程都会执行,而根据角色绑定的会根据角色id分配一个固定的线程池处理,这个固定的线程池是一个单线程线程池,所以保证同一个角色的异步线程能按照顺序处理,避免要处理太多的并发情况。我们现在把根据角色分配的线程池复制了很多个,登录啊,正常处理啊,如果这样,会带来并发问题,顺序处理异步线程这个概念就失去了。于是我们发现会有部分玩家丢失数据,回档。后来改为就一个根据角色绑定的线程池,就好了。登录登出一定要按照顺序进行,登录或者登出过程中(会产生异步线程读取和保存数据),务必不能让玩家再次登录,否则就会产生回档可能。

       还有其他问题,比如数据库那会儿第一天批量开服出现数据库非常缓慢情况,后来运维同学说硬盘被不知情人士拔了导致数据库异常,那会儿着实让我紧张纠结了一回,查了很久异常,一直以为是不是代码这错了。后来数据库他们经过优化后,现在很稳定了。现在游戏很稳定运行了,玩家论坛从一开始骂技术烂到现在开始骂策划把游戏搞傻逼了。

       今年春节回来,确切说从去年10月份开始,就经常熬夜加班了,经常很晚回家了,因为每周都要发版本,有时候一周发2个,全组人员都很紧张疲惫,我也受不了每天一个半小时的上班坐车时间,外加一个班小时的下班坐车时间,加班晚了都没车回去,只能打车,早晨还起不来,起来也是特别疲惫,一天没精神,连续加班那几天,人都感觉快散了。不得已,就搬近点了,以方便随时加班。从乡村到市区,房租涨了3倍,工资分文未涨,我这到底是在操心啥啊!去年这个月份涨工资了,今年没涨,问老大说年中会涨,但是不知道时间。那也只能等了。

        感觉这个游戏项目应该是步入稳定甚至成熟期了,后面的功能也就是纯粹的功能了。可能很快又有会新项目要做,挖坑埋坑可能要继续重来了,开发一款游戏真的好累,我们团队算是比较稳定的,从立项到现在完成,离职人员极少,核心人员全程参与未离开,这也是项目进展得到保证的一个原因吧。我以前公司的一个项目做了很久人来的来走的走,最后虽然上线了,也很快就下线了。所以稳定的开发团队还是非常有必要的,这也是建立在老板肯花钱的基础上。呵呵,这个大家都懂!

猜你喜欢

转载自hfutfei.iteye.com/blog/1889535