针对大型在线多人游戏中服务器的负载过重的问题,为了尽量减少硬件投入,根据作者在实际开发中的经验,提出几项可行的优化策略,减少服务器的负载,提高服务器响应速度,扩展服务器带宽和增加吞吐量,为用户提供更好更快的访问质量和体验。
以下为本篇论文正文:
摘要
鉴于大型多人的网页游戏中,服务器端的负载较大,为了尽可能地节约成本,提高游戏服务器端开发的性能和效率,从数据库前端缓存、数据库的操作、配置文件的实现等方面提出了相应解决方案,从而开发出高效运行的服务器端软件。
关键词:网络游戏;服务器端;数据库;缓存
目录
摘要
关键词
1数据库前端缓存技术
2优化数据库的操作
2.1使用数据库连接池技术
2.2数据库读写分离
2.3减少数据的更新次数
3使用JSON实现配置文件
4结语
参考文献
互联网技术的蓬勃发展和国家政策对游戏产业的支持,使得电子游戏产业得到了蓬勃地发展。游戏产品也变得越来越复杂,由传统的单机版游戏到网络游戏,再到网页游戏。网页游戏无需下载,对客户端的配置没有要求,所以受到广大游戏爱好者的普遍欢迎。如今一款优秀的网页游戏,游戏服务器需同时处理大量玩家同时发送的海量数据,因此在大型多人网页游戏中,只使用一台计算机做服务器是不现实的,服务器的数量往往与客户端的数量成正比。但是单靠升级网络设备又面对价格昂贵和不断升级的困境,为了节约硬件的成本,目前主要有两种途径:(1)采用负载均衡技术;(2)开发高效的网络游戏服务器端软件。主要针对游戏服务器端开发,从数据库前端缓存、数据库的操作、配置文件的实现等方面提出相应解决方案,从而开发出高效运行的服务器端软件。
1数据库前端缓存技术
网络游戏的高交互性导致了大量数据的频繁更新,如果系统中没有任何数据缓存措施,致使每一次请求都需要连接数据库,在访问量不高的初期可能没有什么影响,但是随着用户量的增加,每一次访问都需要连接数据库,以至于数据库无法承受如此大的压力,就会出现服务器无法提供服务的现象。
由于数据库的平均读写时间比内存的访问效率要低1000倍,为了减轻数据库的压力,在游戏软件的设计中都会使用缓存技术,采用“空间换时间”的策略,通过缓存数据库的查询结果来避免对数据库的频繁访问,以提高网页的反应速度,减少延迟、优化性能并节省带宽。但是如果把所有游戏的信息都放在缓存中,又会造成内存耗尽。因此为了更好地发挥缓存的作用,在开发中可以为应用中的所有查询做一些执行时间日志,来帮助分析哪些内容是要重点被缓存的,从而使得缓存服务器尽可能地缓存那些最具影响性能的查询。可以借助于一些缓存服务器软件帮助使用者有效地管理缓存。目前比较常用的缓存软件有Memcached和Redis.一般的对于以下3种情况需要考虑使用数据库前端缓存,定期对数据进行读写:
(1)从数据库读一个非常耗时的数据。
(2)频繁地读取数据库端更新较少的数据。
(3)频繁地写入操作:比如页面的点击量、投票数、用户的得分等。
2优化数据库的操作
虽然使用缓存可以防止过多的访问数据库,但是系统运行中访问数据库是在所难免的,因为即便是有很长的过期时间,缓存命中率很理想,但是缓存的创建和后期的重建都需要访问数据库,尤其是高并发访问的情况下,数据库的压力也是非常大的。这使得不得不关注数据库的性能,不管是查询还是更新,事实上影响数据库的因素很多,如果数据库使用稍有不当,便会拖累整个系统。因此优化数据库的操作是解决游戏开发中性能瓶颈的重点。
2.1使用数据库连接池技术
在网页游戏中数据库连接是一种非常关键的资源,对数据库连接的管理能力会影响到整个游戏的伸缩性和健壮性,从而影响到程序的性能指标。一般采用数据库连接池来分配、管理和释放数据库的连接,数据库连接池在初始化时会创建一定数量的数据库连接放到连接池中,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个,只要数据库连接池中有空闲的连接。连接池通过释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
2.2数据库读写分离
游戏软件运行的过程中,数据库读操作比写操作更加密集,而且查询条件相对复杂,数据库的大部分性能消耗在查询操作上了。为了有效减轻数据库的压力,往往采用数据库读写分离技术,即把对数据库读和写的操作分开对应不同的数据库服务器。主数据库负责写操作,从数据库负责读操作。为了有效地保证数据库的完整性,主数据库进行写操作时,需要将数据同步到从数据库。Quest Share Plex就是比较牛的同步数据工具。
2.3减少数据的更新次数
数据库的更新操作会带来一连串的“效应”:更新操作需要记录日志(以便错误时回滚);更新可变长字段(如,var-char类型)会带来数据物理存储的变化(记录的移动);更新索引字段会导致索引重建;更新主键会导致数据重组等。这一切不但会造成更新操作本身效率低,而且由于磁片碎片的产生会造成以后查询性能的降低。为了应对这一情况,需要尽量减少更新数据的次数。在实际开发中可以尽量减少数据更新的次数,即只有当“不得不”更新数据时才进行更新,从而减轻数据库的压力。比如在网页城池类游戏中实现城池收税时,每分钟的税收是10个金币,如果每分钟都更新数据库,会造成大量的I/O操作,而硬盘的I/O又非常有限(1s吞吐量大约70M左右)。解决的办法是通过设置一个时间戳,每次收税时根据当前时间与时间戳之差计算金币总数,这样可以有效节省硬盘的I/O,仅仅消耗极少的CPU资源,会大大提高系统的性能。金币表的设计如下:
3使用JSON实现配置文件
在网络游戏往往需要设置许多游戏参数,开发中可以通过采用数据驱动代替代码驱动,从而满足参数需要灵活改变的特点,并且易于调试和维护。所谓数据驱动就是运用配置文件来调节游戏的诸多参数。配置文件的实现有许多方式,比如数据库+缓存、本地文件等。由于本地的配置文件比放在数据库中的配置文件读取速度要快,所以推荐使用本地文件。本地配置文件中存放的数据格式也是多样的,如json,ini,yaml,xml等,由于JSON语法简单,解析器易实现,同时便于解析和格式化输出,所以推荐使用JSON实现配置文件。这主要是因为:
(1)JSON的格式方便数据读取
例如:
(2)JSON的格式数据体积小,传输快
上一个例子,写成XML就是:
很明显JSON的体积更小。
(3)客户端操纵XML的时候需要创建ActiveX对象,而JSON则完全就是一个JS对象,不需要创建DOM.
4结语
针对大型在线多人游戏中服务器的负载过重的问题,为了尽量减少硬件投入,根据作者在实际开发中的经验,提出几项可行的优化策略,减少服务器的负载,提高服务器响应速度,扩展服务器带宽和增加吞吐量,为用户提供更好更快的访问质量和体验。
参考文献
[1]邓丽,董玮。网络游戏服务器端研究与设计[J].软件导刊(全称,英文期刊名以黑体标志),2009,8(5):135.
[2]罗永刚。大型网络棋牌游戏服务器端设计与实现[D].济南:山东大学,2011.
[3]赖勇浩。实时网页游戏服务器端架构的设计与实现[D].广州:华南理工大学,2011.
[4]刘树杰。网络游戏服务器端的设计与实现[D].成都:电子科技大学,2009.
[5]张越。网络游戏平台服务器端的设计与实现[D].北京:华北电力大学,2007.