开源服务器框架NoahFrame分享:第一章 游戏服务器的进化

开源服务器框架NoahFrame分享:第二章 插件与模块

NF(https://github.com/ketoo/NoahGameFrame)全称为 NoahFrame/NoahGameFrame。

NF最早为客户端设计,后来随着时代的变化,而为自己又转为服务器开发,故在吸收了众多引擎的优点后(包含Ogre的插件模式&模块化管理机制,Bigworld的数据管理&配置机制,类似MYGUI的接口层次设计),经过多年演化和实践,变成了一套游戏开发J解决方案。方案中包含开源的服务器架构,网络库(站在libevent的肩膀上),和unity3d的demo源码。现在NF已经在多个公司的多个项目中使用,其中包含知名产品 《全民无双》。

关键词

NoahGameFrame/NoahFrame/NF

集群/负载均衡/分布式

网关服务器 GateServer 心跳 多线程/线程池 开源网络框架/模型

一致性hash算法/ConsistentHash

游戏开发中的设计模式/数据结构

Socket Nagle/粘包/开源游戏服务器/ Game Server

一说到游戏服务器,其实大部分人第一认知,估计就是网络库,在很多人眼里,网络库几乎作为服务器坚实技术的代表,但我这里想提醒的是,这些人最后几乎都走了造轮子的不归路,因为网络库虽然是组成服务器软件最重要的基础库之一,但是同时也应该是项目成熟期接触最少的库,唯一却可替代。

第一阶段:最原始的服务器架构

单纯来说很简单,大部分服务器在处理业务逻辑的时候,还会直接处理socketid相关的内容,出BUG让人防不胜防。大概如下图所示:

优点:

开发简单,新成员可以快速理解,无复杂集群状态管理。

缺点:

几乎所有业务均在一起,一处业务出问题宕机,则会影响所有业务;同时不能扩容也不能应对运营不定时带来的流量压力。

第二阶段:支持分线,代理的架构

目前还是有很多游戏服务器属于此类型,对于做手机游戏,小游戏或者创业团队来说,这类方案基本是优选(特别是对于没有历史积累的团队来说--比如说拿unity直接开发服务器,服务器能跑就行了。。。至于负载,质量,则是游戏先能做完,或者能上线再说吧)

优点:

1:增加了多线程/进程机制,可以有效的通过部署应对不定期的流量压力;

2:增加了网关,有效加强了对于外网非法数据的屏蔽能力,降低了GameServer处理这些数据的消耗,不再直接连接数据库,加快了game处理业务的速度。

缺点:增加了新成员对于架构的理解,以及也需要写一部分异步代码(数据库方面),会加入各种转发消息的功能。

第三阶段:支持集群,actor,拆分子结构等方案的架构(NF解决方案)

优点:

1:增加了可动态扩容的多线程/进程/Actor机制,可以有效的通过动态扩容应对大平台带来的流量压力(理论上有机制,就无限扩容);

2:拆分了各种功能划分为单独的服务器,可以有效降低单点故障,加强了集群的可持续性和系统的可用性,避免了单个系统故障可能引起的”雪崩效应“;

3:集群内部服务器,均增加了一致性算法,有效的保障了数据的一致性,和协议路由准确性;

4:大量的actor应用,有效的避免了http,mysql等同步等待的业务堵塞主业务的情况,加强了整个架构的灵活性;

5:大量的基础库插件,大大的提升了开发效率和系统的成型率;

缺点:架构过于复杂,需要一定水平的成员才能驾驭,否则会很容易发生隐藏的非必现事故;

那现在来说一下NF的服务器架构的一些基础内容。

1:区服管理相关

在整体架构上,NF设计为可分区分服也可全区全服部署。如果是全区全服部署,则相当于一个大区扩容接纳所有玩家(在worldserver下面扩容gameserver);如果是分区分服部署,则worldserver下属为一个单服,许多worldserver构成的单服一起注册在master构成整个游戏世界。

2:服务器管理机制

(1)masterserver

masterserver管理所有的loginserver和所有的worldserver,区服的状态和列表,可由worldserver主动发消息更新(所有的loginserver和worldserver一启动就要向master注册),它是整个额架构中的老大,中心节点。同时,次节点可以支持配置多台服务器以避免单点,而且这些无需额外写代码;

(2)worldserver

worldserver管理所有此服下面所有的gameserver和proxyserver,并保存他们的状态(所有gameserver和proxyserver一启动就需要连接到worldserver注册)。同时,次节点可以支持配置多台服务器以避免单点,而且这些无需额外写代码;

(3)loginserver

loginserver主要用于向用户展示区服列表和处理登录逻辑,loginserver一启动就需要像masterserver注册。同时,次节点可以支持配置多台服务器以避免单点,而且这些无需额外写代码;

(4)gameserver一启动就要向worldserver注册并纳入管理,如果worldserver广播下来的服务器列表中有其他worldserver,还需要主动去连接其他的worldserver(几乎所有的server都会有这样的逻辑,扩容用);同时,gameserver接受proxyserver的连接;gameserver内部自带actor,因此架构中不再继续使用DBServer这样的代理数据库服务器;

(5)proxyserver在架构中主要用与代理client数据请求的作用以及核对消息的作用,一启动就需连接到worldserver并接受管理,并从worldserver获取到gameserver(同一个服)列表然后主动连接到所有的gameserver;proxyserver会主动汇报自己的状态和开放端口给worldserver。同时,次节点可以支持配置多台服务器以避免单点,而且这些无需额外写代码;

3:插件和模块机制

下过代码观察的同学就肯定知道,所有服务器中,可执行文件都是一样的,都是一个NFPluginLoader_d这样的执行文件,他启动的时候会自动检测Plugin.xml目录下面的所有插件(plugin),然后加载所有的插件,开始帧循环;而在每个插件中,又有大量的各种程序员们根据功能的归类划分出来的模块(module),插件又会初始化这些模块,然后启动帧循环。插件Plugin作为模块Module的容器/承载着,本身提供了他所承载的Module创造,初始化的任务;所有的Module并行完成所有的业务逻辑,Module与Module可以互相调用接口,为对方提供服务。

4:actor机制

actor机制主要用户解决同步堵塞访问的瓶颈,比如数据库访问,比如http请求,比如长时间运算等问题;在NF中,大量使用了actor技术,后续还有计划,让每个scene都运行一个actor,这样来提升gameserver的承载能力;

5:直链nosql数据库机制

从架构图上可以看出,gameserver直连了数据库,并没有像传统架构那样使用一层数据库代理,是因为基于目前nosql越来越优秀,夸服同步服务需要也越来越旺盛,需要直接内存数据库以开发更复杂的业务。同时,在直练数据库的情况下,又提供actor服,解决了同步存储/加载数据的堵塞问题,使用NF即可支持同步/异步访问数据库;同时,协程技术也支持同步代码异步性能来支持此特性,让程序员不用担心io堵塞问题写同步代码,大大提升了效率;

上述为NF设计上的一些大概内容,如有兴趣,请继续跟进本博客,会持续把整个NF的设计过程讲解出来,也希望持有不同意见的同学加入交流。

NF项目为开源的分布式服务器解决方案,其中包含了网络库,actor库,以及数据驱动等新技术,能大幅提升开发效率节省开发周期以及提高程序的稳定性。

项目地址https://github.com/ketoo/NoahGameFrame

推荐阅读更多精彩内容