大型网络游戏服务器的框架设计(一)

服务器是用来处理高并发的请求,同时能够满足扩展的业务逻辑的需求,最重要的是满足三点:并发性,稳定性,扩展性。

经历过两款上线游戏产品,见识到了游戏行业的杂乱无章,虽然和传统软件行业相比,少了那么些规范,但是对个人能力要求还真不比传统软件行业低。

今天开始,陆续利用业余时间将自己设计的一个服务器的框架贴出来,也会包好一些基本的代码,也会用到一些开源库。从最基础的讲起,首先看看一个实时网络游戏服务器的框架:

目前市面上的游戏,总的来说分为两类:

1.弱联网类游戏,像手机上的卡牌类游戏(MT,Dota传奇等),大部分逻辑在客户端处理,不需要实时联网,这类游戏只有一个玩家,而且只有PVE模式,就是打游戏中的机器人(AI),不存在玩家与玩家的实时交互。例如一场副本打斗,只有在开始和结束,才会连接服务器,请求获取或者存储数据,打斗过程由客户端计算完成,最后将战斗结果提交服务器就行了。

2.强联网类游戏,典型的就是MMORPG或者MMARPG的类型的游戏,一般常见于端游或者页游,也包含手游。在一个地图中,同时有很多玩家,任何一个玩家的状态或者属性发生变化,服务器就需要实时更新游戏中角色的状态,并且通知到周围的玩家。例如在副本中,一个玩家释放技能,攻击范围,伤害计算这些逻辑都是服务器来完成的,而客户端只需要负责特效的显示,这个过程中需要实时的数据交互。

显然,第2种,MMORPG类游戏需要服务器做更多的事情,对服务器的运算要求更高,实时性要求更高,自然实现起来更复杂。

一个大型的网落游戏服务器应该包含几个模块:网络通讯,业务逻辑,数据存储,守护监控(不是必须),其中业务逻辑可能根据具体需要,又划分为好几个子模块。

这里说的模块可以指一个进程,或者一个线程方式存在,本质上就是一些类的封装。

对于服务器的并发性,要么采用单进程多线程,要么采用多进程单线程的方式,说说两种方式的优缺点:

一、单进程多线程的服务器设计模式,只有一个进程,但一个进程包好多个线程:

网络通讯层,业务逻辑,数据存储,分别在独立的线程中,无守护进程。

优点:

1.数据共享和交换方便,使用全局变量或者单例就可以,数据存储方便。

2.单进程,服务器框架结构相对简单,编码容易。

缺点:

1.所有功能只能在单个物理服务器上,不能做成分布式。

2.不方便监控各个线程状态,容易死锁

3.一个线程出错,例如内存非法访问,栈空间被破坏,那么服务器进程就退出,所有玩家掉线,影响大。

二、多进程单线程的服务器设计模式,多个进程,每个进程只有一个线程:

网路通讯,业务逻辑,数据存储,守护进程,分别在不同的进程。

优点:

1.各个进程可以分布在不同的物理服务器上,可以做成分布式的服务器框架,例如可以将数据存储单独放到一个物理服务器上,供几个区的服务器使用。将网络通讯进程独立出来,甚至可以做成导向服务器,实现跨服战。

2.可以通过守护进程监控其它进程状态,例如有进程死掉,马上重启该进程,或者某个进程cpu使用率接近100%(基本可以判断是某个逻辑死循环了),
强制kill掉该进程,然后重启。

3.单个服务器进程异常退出,只要不是网络通讯进程(一般这个都会比较稳定,没什么逻辑),那么就可以及时被守护进程重启,不会造成玩家掉线,只会造成在1-2秒内,某个逻辑功能无法使用,甚至玩家都感觉不到。

4.服务器通过共享内存进行数据交换,那么如果其中一个服务器死掉,数据还在,可以保护用户数据(当然多线程也可以使用共享内存)。

5.并发性相对多线程要高点。

缺点:

1.不方便使用互斥锁,因为进程切换的时间片远远于线程切换,对于一个高并发服务器是无法允许这么高时间片的切换代价的。因此必须设计好服务器的框架,尽量避开使用锁机制,但要保证数据不出错。

2.多进程编程,在各个进程间会有很多通讯,跨服务器进程的异步消息较多,会让服务器的编码难度加大。

下面先按照一个游戏的功能,将服务器的功能分块框架画出来:

以上是一个游戏服务器最基础的功能框架图,接下来要做的就是设计服务器的框架了。

大型网络游戏服务器的框架设计(一),布布扣,bubuko.com

时间: 2024-10-18 18:53:54

大型网络游戏服务器的框架设计(一)的相关文章

大型网络游戏服务器的框架设计

服务器是用来处理高并发的请求,同时能够满足扩展的业务逻辑的需求,最重要的是满足三点:并发性,稳定性,扩展性. 经历过两款上线游戏产品,见识到了游戏行业的杂乱无章,虽然和传统软件行业相比,少了那么些规范,但是对个人能力要求还真不比传统软件行业低. 今天开始,陆续利用业余时间将自己设计的一个服务器的框架贴出来,也会包好一些基本的代码,也会用到一些开源库.从最基础的讲起,首先看看一个实时网络游戏服务器的框架: 目前市面上的游戏,总的来说分为两类: 1.弱联网类游戏,像手机上的卡牌类游戏(MT,Dota

关于大型web服务器的设计思路

大型网站,比如门户网站,在海量用户访问.高并发请求方面,基本的解决方案是以下几点:  1.高性能的数据库(oracle/db2/mysql...)  2.高性能的Web容器(weblogic/apache...)  3.高效率的编程语言(java/C#)  4.使用高性能的服务器(小型机.PC服务器)  5.集群分布式运行(比如上百台小型机器在线运行) 但是在在线用户上百万,日点击量超亿,而数据达几十T,甚至日数据量就达到T级别这种情况下还是难以解决大型网站面临的高负载和高并发问题.   本人也

一种高性能网络游戏服务器架构设计

网络游戏的结构分为客户端与服务器端,客户端采用2D绘制引擎或者3D绘制引擎绘制游戏世界的实时画面,服务器端则负责响应所有客户端的连接请求和游戏逻辑处理,并控制所有客户端的游戏画面绘制.客户端与服务器通过网络数据包交互完成每一步游戏逻辑,由于游戏逻辑是由服务器负责处理的,要保证面对海量用户登录时,游戏具有良好的流畅性和用户体验,优秀的服务器架构起到了关键的作用. 1  服务器架构设计 1.1  服务器架构分类 服务器组的架构一般分为两种:第一种是带网关服务器的服务器架构:第二种是不带网关服务器的服

大并发服务器框架设计

简单谈一谈大并发服务器框架设计的基本思路 基本的服务器框架都是C/S结构的,请求和相应流程是这样的: 这样的框架存在一个很严重的问题,当客户端大并发请求到来,服务器需要进行大量的数据库操作,假设数据库最大连接数为 1000个,此时有10000个请求访问应用服务器,那么应用服务器只能处理1000个请求,剩下99000个等待1000个请求处理好后 再进行访问数据库处理.可以在应用服务器和数据库服务器中间增加中间层DAL,DAL采用缓冲队列和连接池设计. DAL设计缓冲队列,存储等待的请求,并且DAL

弱交互移动游戏服务器端框架设计

很早前即有想法设计一套稳定.高效.安全的弱交互移动网络游戏服务器端基础框架,前些天初步完成简单的初稿文档.初版设计参考了印象里以前的一些工作经历经验.这些经历经验虽已日渐模糊,但从它们这里,自己获益良多. 初稿文档暂只是简单记录了目前想到,或觉得比较重要的内容(或许会更新),具体细节等涉及较少.可能我会在业余时间里一点点实现本文所述框架,只是开发计划暂无法预期,毕竟精力很有限. 1.功能描述 1.1) 弱交互移动休闲类游戏服务器端基础框架(以房间为游戏单位,诸如棋牌类游戏) 1.2) 相较传统的

基于SEDA的异步框架设计与实现

基于SEDA的异步框架设计与实现 二.为什么使用SEDA 目前,面对并发环境,主流互联网服务器编程模型有两种:多线程模型以及事件驱动模型.但是这两个模型都不足以解决这个问题.我们来首先看一下这两种编程模型. 1.多线程并发模型 多线程并发模型是目前最普遍的服务器编程模型,该模型的架构如下图所示:        该模型针对每一个请求,会为其创建并分配一个线程.该线程负责这个请求的处理.该模型的优点:执行粒度是整个完整的处理流程.处理逻辑清晰,容易开发.但与此同时缺点也很明显:如果处理过程中某一步骤

ThinkPHP框架设计与扩展总结

详见:http://www.ucai.cn/blogdetail/7028?mid=1&f=5 可在线运行查看效果哦 导言:ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一些简单的开发示例中来深入了解一下这个框架给我们带来的开发便捷性,以及游刃有余的扩展设计.同时也从源码分析的角度看看框架的一些不足,尽量做全面客观的评价.这里假设大家已经使用过ThinkPHP框架,基本使用方法请参考官方文档. 一.框架分层及url路由 框架的安装非常简单,下载后放入web服务器的目录即可,但

NET架构设计、框架设计系列文章总结

NET架构设计.框架设计系列文章总结 从事.NET开发到现在已经有七个年头了.慢慢的可能会很少写.NET文章了.不知不觉竟然走了这么多年,热爱.NET热爱c#.突然想对这一路的经历进行一个总结. 是时候开始下一阶段的旅途,希望这些文章可以在发挥点价值作用. 架构设计: ElasticSearch大数据分布式弹性搜索引擎使用 (推荐) DDD实施经验分享-价值导向.从上往下进行(圈内第一个吃螃蟹DDD实施方案)(推荐) 软件工程-思考项目开发那些事(一)(推荐) SOA架构设计经验分享-架构.职责

框架设计总结

框架设计总结 温昱老师的<一线架构师实现指南>读完好几天了,本书很多大牛都有推荐,自己从头到底一字不漏的看了,很多关键的方法,做了标记,看了多次,是一本介绍构架设计方面很好的书,准备把它做为工具书,在开始中用好其中的方法. 大学学的软件工程,软件设计要从需求分析.可行性分析.概要设计.软件设计.软件开发和测试,说的是一个大的过程,具体到针对一个项目时还是会感觉无从下手:本书提供的ADMEMS方法体系,把这一过程形成方法体系,让框架设计的操作性更强,四个核心主张: 1)       方法体系是大