一个基于ASP.NET性能优化的WEB服务负载均衡系统的设计和实现
2011-05-08吴文哲
吴文哲
(辽河油田通信公司,辽宁 盘锦 124010)
1 产品研究背景及意义。由于游戏业务特殊性,华宇乐悠游游戏平台的负载呈现出以下特点:
1.1 有活动开展时,活动时间内服务器负载较大。
1.2 没有活动时,工作日的8小时内人数波动不大,负载较小。晚间20时至22时是游戏玩家上线高峰,负载较大。
1.3 国家法定节假日及双休日,游戏人数比工作日增加较多,负载较大。
1.4 游戏服务和WEB服务的业务繁忙程度往往存在并发性。
1.5 不排除部分玩家短时间内多次恶意刷新有数据统计的动态页面,瞬间增加系统负荷。上述这些特点,会导致系统的负荷极不均衡,常常表现出系统运行不稳定,容易死机、死锁,给玩家的愉快体验带来极大地不方便,也给公司的经济效益、社会效益带来严重影响。
2 技术方案的设计与实施
2.1 基于ASP.NET的性能优化机制。要提升ASP.NET应用程序的性能,最简单、最有效的方式就是使用内建的缓存引擎。然而,对于第一次来自于客户端的动态页面访问请求,特别是该页面存在大量需要读取数据库才能显示的内容时,再强大的缓存机制也无法保证服务器性能在首次访问时有出色的表现。
2.2 Global.asax文件的作用
Global.asax文件(也称为 ASP.NET应用程序文件)是一个可选的文件,该文件包含响应ASP.NET或 HTTP模块所引发的应用程序级别和会话级别事件的代码。Global.asax文件驻留在 ASP.NET应用程序的根目录中。运行时,分析 Global.asax并将其编译到一个动态生成的 .NETFramework类,该类是从 HttpApplication基类派生的。
2.3 利用Timer在ASP.NET中实现计划任务
.NETFramework为我们提供了3种类型的Timer,分别是:ServerTimer(System.Timers.Timer),ThreadTimer(System.Threading.Timer)和WindowsTimer(System.Windows.Forms.Timer)。其中WindowsTimer和WinAPI中的Timer一样,是基于消息的,而且是单线程的。另外两个Timer则不同于WindowsTimer,它们是基于ThreadPool的,这样最大的好处就是,产生的时间间隔准确均匀。ServerTimer和ThreadTimer的区别在于,ServerTimer是基于事件的,而ThreadTimer是基于Callback的。相比之下ThreadTimer更轻量级一些。目前平台用ThreadTimer
2.4 数据自动处理流程。数据自动处理流程图如图2-1所示:
2.4.1 乐悠游后台管理站点为实现计划任务,Global.asax.cs文件部分代码如下:
2.4.2 为了实现多个任务在一定时间间隔内计划进行,Jobs.cs文件代码略。
2.4.3 根目录下的配置文件jobs.config文件部分代码如下:
2.4.4 为了实现单个具体任务按照计划进行,Job.cs文件代码略。
2.4.5 以继承自IJob类的GameInOutStock-Total类为例,详细到具体任务的执行流程,GameInOutStockTotal.cs文件代码略。
2.4.6 为了准确记录计划任务的执行情况,SimpleLogger.cs文件作用是记录自动执行任务的日志,代码略。
2.5 WEB服务负载均衡系统的设计与实现。综合以上文件代码,当系统每天按照计划执行任务后,当天所有玩家的输赢游戏币就统计出来了,在任务的最后,我们还新建立了一个表(gameInOutStock),用来保存统计所得数据。
一般来说,统计信息的获得应该是实时查询数据库所得,当涉及到多表关联、跨表查询时,系统的性能会降低很多。这里我们利用ASP.NET的自动执行任务机制,在系统负荷最小的时间段(比如凌晨时间),自动执行多表关联查询,并且建立新表,把日后将要查询所得的结果提前存入数据库。
这样做的好处主要有两点:一、提升系统性能。当要查询信息时,直接从已经生成好的数据表中读取信息,不用涉及关联查询。二、提高数据库系统安全性。如果每次查询信息都要多表联动,由于涉及到的数据表都是和主要业务息息相关的信息,同时这些表中的数据实时更新,对于这种存放重要信息的表来说,频繁的读写操作无疑给数据库增加很大的负担。如果在系统闲时能把重要信息查询出来并且保存到新表,则日后查询新表即可完成查询任务。
2.6 负载均衡系统的推广实践
对于管理员后台系统来说,由于授权进入后台的管理员人数确定,查询访问量不大,这样做的优点除了查询时间有效减少之外,并没有太明显的效果。但是对于公网运行的平台来说,推广这种负载均衡系统就非常有必要了。
http://www.liaoheonline.com/associator.aspx为会员中心页,要正确显示该页左下方的会员等级排行,通常情况下,要到db_lobbyv2库的tb_account表 中 根 据 a_viptime、a_vipapptime 和a_vipexptime三个字段值计算出该玩家当前的会员注册天数,并根据天数计算出会员等级,然后返回给动态页面显示出来。对于少量访问该页面的玩家来说,这些计算量和查询访问量显然不算什么。然而,一旦遭遇到游戏高峰期,对于玩家详细信息表这类至关重要的数据库表读写操作频繁时,将可能造成难以想象的后果。可能带来的灾难是,WEB服务器由于换算时间和计算等级量过大导致宕机、数据库服务器由于众多玩家同时查询访问同一张数据表而死机和网络拥塞等等。为了防止出现以上情况,我们在后台管理系统中按天统计会员天数和等级,并且保存至新的数据库表中。这样当用户再访问该页面时,就不必担心以上不利于公网平台运行的情况发生了。
[1]庄纪林.一个基于HTTP重定向的Web服务负载均衡系统的设计和实现.北京大学图书馆,北京,【期刊】现代图书情报技术,2008-02-25.