网络游戏服务器报警系统的设计与实现
摘要:网络游戏服务器一般都承受着较大的性能考验和负载压力,随着网络游戏玩家数量的增加,后台服务器数量也不断增多,为了高效的管理服务器,并及时发现服务器的硬件或者软件问题,该文设计了一套网络游戏服务器的报警系统,有效的解决了服务器的监控问题,具有较好的应用前景。
关键词:网络游戏;报警系统;服务器;架构
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2013)12-2795-03
网络游戏为了给玩家构建一个庞大的游戏虚拟社区,以增加游戏的娱乐性,通常都要求游戏服务器提供7*24小时的在线服务,且要求游戏服务器尽可能多的承载玩家。因此,网游服务器的性能压力是相当大的[1],如何高效智能的监控服务器系统,以便及时的根据当前在线人数动态调整服务器数量显得尤为重要[2]。除此之外,服务端开发人员通常希望对服务器运行的代码异常信息进行实时监控,通过对代码异常信息的分析,以便于开发人员快速定位程序隐藏的bug。所以,为了构建健壮的游戏后台而设计服务器的报警系统是非常具有实际意义的。
1 常见网络游戏服务器的架构
本文的网游服务器报警系统是针对于游戏服务器来设计的,但它不局限于某种具体的服务器架构,而是旨在提供一种通用的服务器报警系统的解决方案。在介绍网游服务器报警系统之前,先了解下常用网络游戏服务器的架构。
网络游戏一般设计为C/S的结构[1],服务器端主要负责玩家的登陆、数据存储以及游戏核心逻辑的计算等。一个常见的网络游戏服务器架构如图1所示。从图中可以得知,这个游戏服务器架构是由game server、gate server、database三部分组成。game server主要负责游戏的具体逻辑处理,gate server负责玩家登陆与验证,database负责玩家资料信息的存储。其中game server类型的服务器是可伸缩的,以便随着玩家数量的增加而动态调整game server服务器的数量,从而使得整个系统承载更多的在线人数。
2 网游服务器报警系统的设计
网络游戏服务器报警系统的设计目的是为了便于开发和维护人员更好的管理服务器和发现服务器上出现的问题,因此,基于这个设计初衷,本系统规定了一些设计要求:
报警系统不能对游戏后台造成负担,杜绝影响到现有服务器性能的问题。
报警系统需要有简洁明了的接口,方便快速的部署到现有服务器架构中。
报警系统需要对收集到的信息进行相应整理,并能以邮件或者短信的形式及时通知开发或者维护人员。
基于上述设计原则,该文设计了一个网游服务器报警系统,如图2所示。为了便于报警系统集成到任意服务器架构当中,而将此系统设计成了一个客户端、服务器模式[3],分别简称为alarm_c和alarm_s。alarm_c部署到具体应用服务器上,并通过与alarm_s建立socket连接,以便向alarm_s传输相关数据信息。alarm_c收集的信息分为两类,一类是收集应用服务器当前的内存、CPU占用情况,这类信息只需要定时发送给alarm_s即可。另一类是收集应用服务器上运行程序的代码异常信息,需要实时向alarm_s提交这类异常信息[4],以便于开发人员及时分析代码中的bug情况。
图2 报警系统的C/S模型
图3即是集成了报警系统的常用服务器架构。由图可知,alarm_c部署到了所有的应用服务器上,并会定时向alarm_s汇报当前某台应用服务器的具体性能指标,那么alarm_s根据这个定时汇报信息能得出一些结论:
1)如果alarm_s能定时收到某台应用服务器的性能状态信息,首先可以判断这台服务器的进程是正常运行的,然后继续分析该服务器的性能状况,如果超出了设定的性能上限,则立即给开发人员发送报警信息。
2)如果alarm_s没有定时收到某台应用服务器的性能状态信息,那么可能是应用服务器进程崩溃了,或者网络连接出现了问题,这时都需要及时通知开发人员来排查问题。
图3 集成了报警系统的服务器架构
3 网游服务器报警系统的实现
报警系统是由java语言开发,分为alarm_c和alarm_s两部分,因此分别对这两部分的实现进行介绍。
3.1 alarm_c部分的实现
所在应用服务器的内存和CPU使用情况收集是通过下面的代码来实现:
OperatingSystemMXBean osmb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
系统物理内存使用率为 (osmb.getTotalPhysicalMemorySize()-osmb. getFreePhysicalMemorySize()) / osmb.getTotalPhysicalMemorySize(),
系统CPU使用率为monitorInfo.getCpuRatio().
对应用程序中异常信息的收集实现,只需要在程序的消息处理逻辑的入口函数中对异常信息捕捉即可:
try {
Object[] commandParams = new Object[2];
commandParams[0] = this; :\2013年学术和海外\飞翔导入图片目录5\江岸>:\2013年学术和海外\飞翔导入图片目录5\江岸>
commandParams[1] = m_unpack;
// 执行命令
m_command.invoke(m_service, commandParams);
} catch (Exception error) {
代码中的异常信息即为此处的error参数。
}
通过上面的实现,alarm_c获得了系统当前CPU、内存的使用率情况,并能捕捉到程序代码中的异常信息,然后将这些信息分类整理后通过socket发送给alarm_s。
3.2 alarm_s部分的实现
alarm_s会对收到的应用服务器性能状态信息进行处理,如果CPU、内存使用率超过某个设定值,则启动对开发人员的通知接口。此外alarm_s会用一个lastReportTime变量记录上次收到alarm_c定时汇报的时间,如果发现lastReportTime变量值超出了默认值3分钟,则会认为应用服务器出现了故障,同样会启动通知接口。该通知接口运用了中国网建提供的SMS短信平台[5],相应的接口调用如下:
HttpClient client = new HttpClient();
PostMethod post = new PostMethod("http://gbk.sms.webchinese.cn");
post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gbk");
NameValuePair[] data ={ new NameValuePair("Uid", "username"),new NameValuePair("Key", "password"),new NameValuePair("smsMob","phone_number"),new NameValuePair("smsText","content")};
post.setRequestBody(data);
client.executeMethod(post);
4 结束语
本文设计了一套网络游戏服务器报警系统,通过将报警系统嵌入到服务器架构中,使得开发人员能实时掌握整个服务器后台的运行情况,且实现成本较低,便于部署,有效的提高了服务器后台系统的健壮性和维护的便利性,具有良好的应用价值。
参考文献:
[1] 杨玲.一种高性能网络游戏服务器架构设计[J].网络安全技术与应用,2010(4):59-61.
[2] 金一长.服务器集中监控报警系统的设计与实现[J].中国金融电脑,2011(12):44-46.
[3] 彭红艳,肖庆,梁桂才.网络服务器管理系统的设计与实现[J].电子科技大学学报,2007(12): 1386-1388.
[4] 向模军.Java异常处理的设计原则[J].电脑编程技巧与维护,2010(8):119-120.
[5] 黄山.短信接口及其应用程序的开发[J].广东自动化与信息工程,2006(1):21-23. :\2013年学术和海外\飞翔导入图片目录5\江岸>:\2013年学术和海外\飞翔导入图片目录5\江岸>
评论