刘海礼

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  26 随笔 :: 0 文章 :: 38 评论 :: 0 引用

公告

2011年11月5日 #

高性能的网络游戏服务器的设计[转]
2007年10月05日 星期五 18:08
    说起高性能的网络游戏,有2个典范,1个是暴雪的WOW,另外一个要数腾讯的QQGame了,因为对于MMPRPG的体系接触不深,几乎属于文盲,没有太多的发言权,而自己又是搞休闲游戏开发的所以本文就主要谈谈QQGame了。

    前些天通过朋友得到了QQGame的一个系统分析的文档,看完后很是震惊,彻底被QQ的设计所折服了,到底是千万人在线系统经验的拥有者,牛!

    通过资料了解到QQGame目前有以下让我欣赏的特性:

1.单机最高容纳35,000人同时在线,对没有看错是这么多,由于它适用了Linux下高性能的网络处理模型ePoll技术,并且一系列高超的优化技术轻松破万人,当然为了稳定性考虑单机保持了2万人的容量,此时的带宽消耗为近30M;
2.采用共享内存方式高速完成进程间高速通讯;
3.服务器的扩充方式不是平面的方式,而是裂变式的扩充方式,形成负载均衡阵列树状结构;
4.所有的游戏服务器不是直接和数据库联系,而是和数据proxy(qq管叫数据交换机和路由器)进行联系,由此带来的就是游戏用户数据的分布存储,我分析着应该是proxy上记录着这个用户数据所在的实际的dbserver的信息,然后定时的将最新的用户信息写回到db中去,这样就大大缓解了数据库服务器的压力,而且可以非常平滑的将数据分裂开来,数据库服务器也就可以无限的扩充,当然我觉得肯定有个数据库信息索引了用户的id和对应的存储地点的关联关系,这点就类似于google的原理了,所以对于数据库的硬件要求也就不是那么高了,qqgame的一组服务器通常是7台服务器,可以容纳5万人,其中就包含了数据库服务器,这点就不是棋牌游戏所常使用的数据集中存储了;
5.游戏服务器的网络和逻辑分开,不仅仅是层次上的分开,而是在进程上分开,然后中间通过共享通道进行管理和协调,并且增加了辅助线程,在主线程处理大压力的异步的操作的时候直接交给辅助线程处理,保障了游戏服务器的高效性运转。
    作为游戏服务器的结构方面(以下只讨论休闲游戏部分,MMORPG服务器不属于讨论范围)的设计已经相对于成熟并且统一,结构方面和3年前我所接触的中游系的那套平台没有太大的差异,无非是服务器群采用星状的结构,以1个中心节点作为核心,然后向四周扩散出一些应用服务器,如负责登陆的LoginServer,负责具体游戏逻辑的GameServer等等,当然最精简的结构是这样的,这样的结构可以满足50万以下同时在线的容量,如果为了满足更大的容量,如QQGAME这样的目前已经有200万以上同时在线的超大容量的应用则需要额外的优化,从这个结构中分离出一些子应用独立开发出一些服务器端来处理,一方面降低偶合度,另外一方面作为高可用性系统为负载均衡提供条件.

关于负载均衡,作为整个游戏平台的所有服务器.我觉得除了具体的游戏逻辑服务器以外都是可以采用负载均衡,多点分担的方式来处理,惟独逻辑服务器不可以,因为休闲游戏,都是分层次的,不管泡泡堂也好,QQGAME也好这些游戏其实在客户端的表现形式都是分层次的,如QQGAME就是LOBBY-HALL-ROOM这样的结构,LOBBY这层就是游戏广场了,可以看到所有的游戏类别,游戏服务器和具体的游戏大厅,比如:牌类–斗地主–新手场–新手场1 这样的顺序,传统的设计中新手场1就是属于一个独立的游戏逻辑服务器拥有一个独立的IP以及侦听端口,在服务器端通常也是一个独立的进程.一般的游戏服务器允许的连接数通常都是300-600人之间超过的就提示服务器已满了,这样做的原因并不是因为进程的限制因为一个进程完全可以做到同时让3000以上的玩家同时游戏,而是人为设计的考虑,因为在游戏逻辑服务器中有很多需要广播的消息,如游戏玩家的聊天信息,某个房间的开始信息,结束信息,某人进出的信息等,而对于广播来说,给300个人广播和给3000个人广播所消耗的资源是绝对没有可比性的。但是通过从进程上独立来处理这个传统的方式也有个缺陷,比如通过开10个进程来达到3000人和1个进程达到3000人,如果不考虑广播的因素在内的话前者的资源是要高与后者的资源的,并且进程间的通讯也要比进程内的通讯要耗费资源和复杂度方面要高很多,比如说如果要实现一个需求让玩家可以在同一类游戏中可以使用小喇叭类或者跨游戏服务器找人之类的功能的话,同一个进程的优势就显示出来了,为此QQGAME所使用的是Channel(频道)的概念,即一个游戏逻辑服务器的进程可以容纳5000人左右,然后服务器端通过设置分割出很多的Channel如新手1,新手2,新手3之类的传统意义上的游戏大厅,将消息的分发范围进行隔离,节约了资源。这一点可以通过查看连接属性看到,连接QQGAME的同类型靠近的几个游戏大厅其实端口和IP都是一致的。

我们目前的游戏服务器类型主要有3类:CenterServer,管理着所有的服务器连接,LoginServer 负责处理用户的登陆、注册,并且用来给用户传递游戏逻辑服务器列表等功能, GameServer具体逻辑服务器,根据不同的逻辑来实现不同的游戏需求。

当然,根据业务的发展需要,我们正准备把用户的状态在服务器端保存,并且增加一个类似IM服务器的功能来满足玩家跨服务器聊天和查询其他玩家状态的需要。以及GM服务器实现多功能的网管室的需求,这些将在以后慢慢写。

今天开始写些技术的题材,一方面记录一些自己的本分工作的东西,另外一方面也是充实一下BLOG,工作太忙也没有什么太多的思绪来一直写其他的题材,所以就拿工作来填充了.同时如果有人有幸看到了这些文章,并且也有兴趣的话也希望多多探讨.

先简单介绍一下,由于本人的工作就是游戏开发公司的,一直与游戏开发打交道,主要做休闲类的游戏,目前又以棋牌游戏为主,在这个行业中摸爬滚打了整3年了,从运营开始做起,运营过当时国内一流的游戏平台中游系列的产品,然后由于合作方面的原因又自主开发过一套游戏平台,然后由于发展方向上的分歧出来单独做,目前在开发并运维一套全新的产品.

这篇主要是对于游戏服务器的一些想法,结合目前自身的产品的一些问题延伸开来的.

目前我们的服务器还是属于Windows平台的架构,暂时还没有考虑到跨平台,主要原因有2:
1.成本:作为公司来说首先得考虑的就是成本了,虽然说Linux类的平台存在着操作系统成本低廉,性能优异,稳定性高这几个特色,但是作为全局考虑来说,一个Linux的系统管理员,以及开发人员的成本要比Windows平台要高很多,并且作为操作系统方面是免费的,但是支持几乎是没有的只有一些不适合商业应用的开源社区作为支撑,要得到更加好的服务或者额外的支持还是得通过大厂商的高额的产品或服务来实现,而Windows平台则不同,虽然操作系统貌似价格不扉,但是本身就带了很多的模块,比如组件服务,日志服务等等,加上平台上各种软件的数量也和Linux下的不是同一量级的,可选择性要大的多,而让Linuxer所诟病的Win32的安全性其实完全可以通过另外独立的安全模块,如硬件防火墙等来完善,毕竟操作系统不是专门做安全防护的Linux也存在很多的漏洞,并且随着Linux发行版的日益增多,用户的逐渐了解,漏洞也日益的增多.
2.开发效率.无疑Visual Studio系列开发套件是目前开发领域最方便最强大的IDE环境,这已是不争的事实,而如果用VI + GCC的模式去开发LINUX下面的服务器其效率和质量至少从我目前的水平(可以部分代表国内目前中小游戏软件开发商实际现状)要彻底的领悟并转换需要一定的时间,并且还没有成熟的开发平台作为保证, JAVA好象有 但是C++还没有听说有超过VC++的.

posted @ 2011-11-05 00:30 小芒果 阅读(179) 评论(0) 编辑

2011年10月28日 #

河南省土资源厅领导你好!

  修路占用我家大概8分耕地,按一亩10分计算的,但是村里告诉我们一次补偿给我们2500元,我查了国家对征收农民耕地的补偿标准。其标准对征收耕地的补偿费用包括土地补偿费、安置补助费以及地上附着物和青苗的补偿费,其中土地补偿费、安置补助费是国家发给集体的,也就是发给村里的,河南省的土地补偿为32000每亩。地上附着物和青苗的补偿费是应该发给被征用的土地使用者,补偿的标准每个地方时不一样的,总体是季产值的1/3左右。我们家现在有70年的使用权,如果按2500元这样平均下来也就是每亩每年补助了我们附着物和青苗28元。请问这种操作是否合理,如果不合理你们有什么样的解决办法?等待你们的回复

posted @ 2011-10-28 21:38 小芒果 阅读(29) 评论(0) 编辑

2011年10月25日 #

http://www.cnblogs.com/kingthy/archive/2009/08/17/net-vtemplate.html

posted @ 2011-10-25 23:16 小芒果 阅读(39) 评论(0) 编辑

新版微软一站式代码管理安装地址http://1code.codeplex.com/releases/view/64539

posted @ 2011-10-25 22:49 小芒果 阅读(26) 评论(0) 编辑

2011年10月24日 #

摘要: 可重用的IQueryable基类 很久就想开始一个使用IQueryable介绍创建LINQ提供器的系列文章了。一直有人通过微软内部邮件或论坛提问问我相关的建议。当然,我也一直回答他们说,我正在做一个简单示例,很快就会让你们知道一切。然而,我希望一步一步来深入并解释一切,而不是一下子给你们一个完整的示例,让你们自己去探索。 首先,我应该指出的是在Beta2中IQueryable有改变。它不再只一个接口,而是分成了两个:IQueryable和IQueryProvider。在实现它们之前,让我们先来看看。 如果你使用Visual Studio的“转到定义”,会看到如下代码: public inter阅读全文
posted @ 2011-10-24 22:50 小芒果 阅读(705) 评论(0) 编辑

如集合对象IEnumerable<>

var type= typeof(TreeNode);           

 Activator.CreateInstance(typeof(IEnumerable<>).MakeGenericType(new Type[] { type }), BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, new object[] { this, type }, null);

posted @ 2011-10-24 13:26 小芒果 阅读(28) 评论(0) 编辑

2011年10月17日 #

http://msdn.microsoft.com/zh-cn/library/bb546158.aspx

posted @ 2011-10-17 22:34 小芒果 阅读(48) 评论(0) 编辑

2011年10月16日 #

摘要: 经过7天的时间终于把流程引擎的表单编辑器写完了,该编辑器基于kindeditor以插件的形式编写,其实前面3天一直在研究kindeditor。插件的右键功能也研究了一天,由于在官网没有找到右键是如何做的,所有只有自己在他的源代码里找了,在此记录下开发的过程。第一天,在网上搜索在线html编辑器,比较了几个编辑器,1.觉得kindedito界面比较清爽,2.文档官网也有一些,3.需要的表格单元格合并等功能也有。第二天,学习kindeditor的插件编程,以label插件开始尝试自己写,其它功能都可以实现唯独插件右键菜单不知道如何实现第三天,重构自己的js代码第四天,终于找到了kindeditor阅读全文
posted @ 2011-10-16 22:33 小芒果 阅读(1448) 评论(6) 编辑

2011年10月14日 #

摘要: 在Web开发中经常会遇到文件上传的功能,如果是小文件,很简单;如果遇到的客户需要上传几个G甚至几十G、几百G的文件,那么就出现问题了!为了安全起见,Mvc的Config设置根本就不允许上传这么大的文件。经过多次试验比较,我向朋友介绍一种简单易懂的方法:借助于Jquery的JqUploader控件。环境 Asp.Net Mvc3 + Vs2010使用的脚本 jquery-1.5.1.min.js 、jquery.flash.js、 jquery.jqUploader.js配置Webconfig<httpRuntime executionTimeout="300" max阅读全文
posted @ 2011-10-14 13:19 小芒果 阅读(96) 评论(0) 编辑

2011年10月13日 #

摘要: 这篇是这个系列的最后一篇了,对于BlockExpression不再深入展开了,只对之前的泛型调用支持及typeof操作补漏。这次是进一步完善了grammar,现在能正常解析泛型调用及typeof操作,这使得我们能对这2种表达式进行正确的转换了。大家可以从http://tinynetevent.googlecode.com/files/ExpressionParser0809.zip下载到最新的代码。由于对grammar作了一点修正,所以之前PareeTreeNode的扩展方法GetClrType也需要跟着改了:view plaincopy to clipboardprint?public st阅读全文
posted @ 2011-10-13 22:50 小芒果 阅读(60) 评论(0) 编辑

仅列出标题  下一页