国内技术大牛有哪些搞手游服务器的大牛

    最近闲着没事把云风的《》看了个遍,希望能从大牛的开发轨迹中得到一些启发。但可能是因为本人level太低,一遍看下来还是云里雾里,不甚明白。没办法只好再看一遍,希望能对他们的服务器端架构有个简单的认识,这里同时做些笔记。
PS:本文是我个人对云风的开发笔记的读后感,可能会有很多错误,慎入!
----------------------------------------华丽丽的分割线-------------------------------
一、服务器划分原则  
    在现有的网络游戏服务器端架构中,多是以功能和场景来划分服务器结构的。负载均衡和集群暂且不在本文中讨论(bigworld、atlas)。服务器划分可以基于以下原则:
分离游戏中占用系统资源(cpu,内存,IO等)较多的功能,独立成服务器。
以多线程或多进程的编程方式适应多核处理器。
在同一个服务器架构下,应尽可能的复用某些服务器(进程级别的复用,比如场景服务器)。
运行时玩家数据的保存、修改及数据流向应该是设计的焦点,它同时也决定了服务器应该如何划分。
服务器的划分应该适度,在保证清晰的数据流向的前提下,根据游戏的类型和规模尽量减少服务器或服务器进程的个数,以减少服务器之间过多的复制数据、锁冲突(使用共享内存进行通讯时)。
主要按照场景划分进程,若需按功能划分,必须保持整个逻辑足够简单,并满足以上1、3两点[1]。
    接下来我们来看看云风的服务器架构是如何处理好以上几点的。
图1 服务器架构(此图为本人猜测,可能有误)
二、运行时的玩家数据
    网络游戏服务器程序一项重要的工作就是根据client发过来的数据包,在服务器端模拟玩家的行为操作并把这些行为广播出去。那么服务器程序在运行时就需要一些实体来保存玩家的数据,这些实体可以是一个类,也可以是一个线程,设计思想不同采用的实体差别也会很大。这里涉及服务器端设计的一个核心问题:运行时玩家数据的保存、修改及数据流向。
    云风通过抽象实体agent来处理单个client的服务请求,agent和client是1:1的关系(见图1)。agent是在gate程序后端,负责翻译、转发以及回应客户端发过来的请求。agent的主要工作内容见云风的《》。值得补充的是设计agent的主要优势是:
把对单个 client 服务的代码集中写在 agent 服务中。由 agent 再和内部其它服务沟通。数据加载使用共享内存的方案,由 agent 向持久化模块发出信号,做加载或纯盘处理,通过共享内存得到结构化数据块。[2]
    agent相当于client在服务器上对应的实体,玩家的属性和数据只能由agent来修改,别的服务只有读权限。通过attach操作获得数据(attach可能是通过服务器通讯框架skynet,也有可能直接mmap到共享内存sharedb上以获得数据)。
    agent的设计使得整个系统对玩家数据的修改只有一个输入点,数据流十分的明确,易于维护。虽然这种设计可能会照成数据的多次复制,但是带来的代码维护和查错上的便利是十分可观的。
    如果把所有的agent放在同一个进程里,在编程该程序时还应该考虑到容错问题,比如说(1)使用C++编写这个程序,agent以类的形式存在,使用thread pool来处理收到的数据包,实际操作时thread的数量是会远远小于agent的数量的,数据包到达后会在队列里等待thread调用agent的逻辑来处理。这是一种比较常见的设计方法,但要注意的是由于agent都放在一个进程里,程序的健壮性要求很高,一个进程core则会导致全服玩家掉线。而使用C++编写也增加了宕进程的可能性……..你懂的。(2)使用java编写,对于这种“中心节点”式架构来说可能是更好的选择,起码不是因为一个玩家的误操作(可能使用外挂)导致全服玩家掉线。(3)云风似乎是使用lua coroutine来实现agent的相互隔离和协同工作的,这样可以减少单一agent失败对其他agent的影响(动态语言的好处)。
    sharedb在系统中的地位看上去像是database前端的cache,但就本人的理解sharedb的作用远不止是一个数据缓存。
    和天龙八部的ShareMemory类似,sharedb也采用了定长的结构化数据(见《》),通过共享内存来实现进程间的数据共享。sharedb的存在使得游戏逻辑处理和数据保存逻辑得到很好的隔离,游戏逻辑不用关心后端的数据是如何保存的,只要sharedb挂上定期存盘的服务,在接口定义明确的情况下,后端到底采用什么样的数据库变得不是那么重要,从而降低了系统的耦合度。
三、服务器底层框架skynet
    skynet的设计思想见《》:
    我希望我们的游戏服务器(但 skynet 不仅限于用于游戏服务器)能够充分利用多核优势,将不同的业务放在独立的执行环境中处理,协同工作。这个执行环境,最早的时候,我期望是利用 OS 的进程,后来发现,如果我们必定采用嵌入式语言,比如 Lua 的话,独立 OS 进程的意义不太大。Lua State 已经提供了良好的沙盒,隔离不同执行环境。而多线程模式,可以使得状态共享、数据交换更加高效。而多线程模型的诸多弊端,比如复杂的线程锁、线程调度问题等,都可以通过减小底层的规模,精简设计,最终把危害限制在很小的范围内。这一点,Skynet 最终花了不到 3000 行 C 代码来实现核心层的代码,一个稍有经验的 C 程序员,都可以在短时间理解,做维护工作。
    做为核心功能,Skynet 仅解决一个问题:
    把一个符合规范的 C 模块,从动态库(so 文件)中启动起来,绑定一个永不重复(即使模块退出)的数字 id 做为其 handle 。模块被称为服务(Service),服务间可以自由发送消息。每个模块可以向 Skynet 框架注册一个 callback 函数,用来接收发给它的消息。每个服务都是被一个个消息包驱动,当没有包到来的时候,它们就会处于挂起状态,对 CPU 资源零消耗。如果需要自主逻辑,则可以利用 Skynet 系统提供的 timeout 消息,定期触发。
    Skynet 提供了名字服务,还可以给特定的服务起一个易读的名字,而不是用 id 来指代它。id 和运行时态相关,无法保证每次启动服务,都有一致的 id ,但名字可以。
    本人感觉skynet像一个发布订阅的消息中间件(还没看源码,可能有误),这种基于服务的即插即用式的框架给服务器端带来很大的可扩展性,同时也使得各模块之间独立清晰,具有良好的可维护性。但是这里有个疑问,服务都以so的形式挂在skynet上,那么这些服务从哪里获取玩家、怪物、NPC等object的数据?是从skynet中获得还是直接从sharedb中获得,出于性能的考虑是不是要把skynet和sharedb部署在同一台物理主机上?这样一来就会增加设计和具体逻辑的耦合度。看了《》,感觉skynet上的服务是要通过skynet来获得玩家的数据,这样操作会不会导致数据被复制很多次,不知道最终的效率是否受到影响?
    满足服务器划分原则里的第一点:分离游戏中占用系统资源(cpu,内存,IO等)较多的功能,独立成服务器。
    gate的主要工作可以参见本系列blog的第二篇《》
五、场景管理器
    主要用于管理静态场景和动态副本,比如agent登录时查询自己所在场景对应的服务器地址。
六、场景服务器
    场景服务器的内容我没有从《开发笔记》中得到太多的信息(可能level太低),更多的是以功能模块的形式写,比如AOI。不过其中有一点比较新颖的是云风认为player的位置、动作状态,战斗数值状态等都是场景的一部份,应该保存在场景中而不是agent中。本节有所更正见(八)补充。
    据我的猜测,场景服务器应该会负责:
怪物行走控制,player移动更新及位置同步
怪物AI策略
区域性广播,场景广播
AOI服务(Area Of Interest )
    需要注意的是场景服务器修改的一些数据应该以什么样的频率通知agent呢?比如player的位置信息,该信息是完全保存在场景数据里还是说agent里也有一份?
    本文是一篇云风《开发笔记》系列blog的读后感,所述内容均是本人的猜测,虽恐贻笑大方,但也希望能抛砖引玉。收笔忐忑ing!
八、补充:
  (1) 云风在微薄上的回复是:“我们最终采用的是单进程多线程, 每线程上一个 lua state 的结构. sharedb 是用来线程间数据交换的. gate 和 sharedb 以及 loader 和 agent map 一样, 都是 skynet 下的独立服务, 以 so 挂接进去的. 后来的商品交易, 掉落品分配也是 skynet 下的服务. ”
  (2) 关于场景服务器,云风已经给出完整的说明,见《》
    场景服务分成两个部分,一是副本管理器,二是地图服务。在角色数据上,记录有角色应该属于的地图。agent 向地图所属的副本管理器查询,得到他所属的地图服务地址。便可以把自己注册到具体地图上。
    地图服务管理了所有其中的角色 id ,以及若干 npc 。他的义务在于把让这些 id 对应的 agent 相互了解。但具体逻辑则放在每个 agent 服务上。每个 agent 自己所属进程 attach 其它 id ,可以获取其他对象的状态。
  .........
  (3) 风哥在《》中已经提到最终使用单进程多线程的模式。看来简单设计是有共识的:-)
References:
[1]《游戏服务器的架构设计》:
[2] 云风,《开发笔记(9)》:
阅读(...) 评论()CMGE 中国手游[广州]
公司地址:广州市天河区天府路233号华建大厦A座15楼
公司印象[限六字内]:
CMGE中国手游[广州]-----我们需要你:游戏大牛们!
您喜欢游戏吗?热爱游戏吗?
想进入自己喜欢的行业工作吗?
想找可以一边玩游戏一边工作的职业吗?
不要怀疑,你可以把游戏变成自己的一份职业,加入我们大家庭吧!在这里你将可以实现你的梦想!
游戏行业是个不缺钱的行业!!!
你忍心蜗居在10来平米的小屋里吗?你忍心看着自己的女友和你奋斗一辈子还供不起一套房吗?你忍心看着你父母缩衣节食把仅有的一点养老金帮你还房贷吗?这里才是实现你梦想的地方!!!
在这里,你可以结识一帮志同道合的“武林高手”共创游戏梦。
在这个温馨的大家庭里,进入这么有前途的游戏行业。“寻志同道合之人、寻竭忠尽智之人、寻深思远虑之人、寻勤恳至诚之人”加入我们,待遇从优,别再犹豫,给你一片海域,换你一生奇迹!非诚勿扰!
游戏行业的发展,本就是一种人生与职业的“游戏”。
我们不需要你爸是李刚,也无所谓介于牛A或牛C之间,只要您对游戏行业的向往如追星般的热情,执行力像城管扫街那般雷厉,敏锐度像发改委调油价那般精细,那就来吧!
在游戏的世界里,你就是主宰着一切的那个人。
你是否已经对小公司的发展空间感到窒息?&你是否正为储存已久的创作能量在寻找更为广阔的战场?&无论天涯海角、无论冰天雪地你都义无返顾?&那么,迅速加入我们的战役吧!在这个战场上只需要想成为将军的你!不分国籍、不分男女、不分年龄…
什么五险一金,什么节假日,这些谁没有?大企业有大智慧,更有大平台。我们有分红,有期权,还有内部创业机制,员工活动更是精彩纷呈。来吧,跟我们一起兢兢业业工作,开开心心生活!
不论你是技术、美术、策划、运营,只要你认为自己行,我们的舞台就将会一直为你而开放!
还在等什么?!赶快行动吧!简历作品接收:(请注明应聘职位)
详细招聘信息请登陆官网:查看。
CMGE中国手游[广州]-----我们需要你:游戏大牛们!
最新更新: 12:23:34公司热度:3173
条记录   共3页 当前第1 页
DOGAME游戏人才招聘HNYU GAME 京ICP备号114网址导航有什么开源的java编写的游戏服务器后台么? - 开源中国社区
当前访客身份:游客 [
当前位置:
RT ,最好再能推荐几本书、THX
共有9个答案
<span class="a_vote_num" id="a_vote_num_
<span class="a_vote_num" id="a_vote_num_
<span class="a_vote_num" id="a_vote_num_
netty,mina看netty就好。源码文档都是齐全的。
<span class="a_vote_num" id="a_vote_num_
框架只提供砍刀,具体业务不负责。
<span class="a_vote_num" id="a_vote_num_
& 我看过也用过netty,现在公司用的游戏服务器就是用netty写的, 但是我感觉做的不是很好,所以想看看有没有好一点的开源的游戏服务器,要是也是用Netty的就最好了。
<span class="a_vote_num" id="a_vote_num_
& 我不是想要框架 、而是类似SFS这样的游戏服务器后台引擎
<span class="a_vote_num" id="a_vote_num_
都不咋样,效率低。
<span class="a_vote_num" id="a_vote_num_
& THX ,有没有什么好的学习资料呢?
<span class="a_vote_num" id="a_vote_num_
引用来自“此名被占用”的答案@
& 我看过也用过netty,现在公司用的游戏服务器就是用netty写的, 但是我感觉做的不是很好,所以想看看有没有好一点的开源的游戏服务器,要是也是用Netty的就最好了。那里不好改那里
更多开发者职位上
有什么技术问题吗?
gongwei...的其它问题
类似的话题

我要回帖

更多关于 国内机器学习大牛 的文章

 

随机推荐