简论游戏服务器架构设计

一、QIPAI类服务器的特点

1,QIPAI类不分区不分服

  一般来说,QIPAI游戏都是不分区不分服的。所以QIPAI类服务器要满足随着用户量的增加而扩展的需要。

2,房间模式

  即在同一局游戏中就是在同一个房间中,同一个房间中的人可以接收到其他人的消息。

3,每个房间的操作必须是顺序性

  这个特性类似与一般游戏的回合制,每个玩家的操作都是有顺序性的。

  二,需要解决的技术点

1,数据共享

  因为QIPAI类游戏不分区不分服,我们在设计服务器的时候,是按世界服的思想去设计,即服务器是一个n多台物理机的集群。当用户登陆服务器,创建房间时,可能根据负载均衡算法,它可以在任何一台服务器上面。所以,不管用户登陆到哪一台服务器上面了,都可以获得自己的数据。我们可以使用redis来做数据共享。

2,如何进入房间

  在同一局游戏中,我们要求所有人都在同一个房间中,我们可以规定在同一个房间中的用户,必须登陆到同一台物理服务器上面。在创建房间完成之后,其他人根据房间号查找房间的时候,可以根据房间号,获取这个房间所在的服务器ip和端口,判断一个当前用户登陆的服务器ip与房间所在的服务器ip是否相同,如果相同,就不做切换,如果不一样,客户端就使用ip和端口,连接到房间所在的服务器上面。

3,保证房间操作的顺序性

  创建房间成功之后,接下来的操作都要保证它的顺序性,所以房间需要有一个它自己的消息个队列。我们可以把每个房间到达服务器的消息封装为一个任务,把这个任务放到消息队列中,然后有一个任务执行者去按顺序执行这些任务。

  三,系统架构

1,功能设计

a,登陆

  一般都是需要接第三方登陆,登陆这一块是http操作,我们统一提供一个web服务,用来做登陆验证。因为在登陆时,调用第三方的http服务,这个过程可能很慢,如果放在逻辑服务器的话,可能会卡业务逻辑任务。因为可能不同的玩家业务请求可能同在一个线程中,如果有任务卡了,那么这个任务以后新来的请求请会卡住,导致消息延迟。

b,获取游戏公告,也放在web服务中。公告一般是游戏登陆的时候向服务器获取一次。把它放在web服务器中,与业务逻辑分离的好处是,当业务逻辑服务器维护或更新的时候,不影响用户的登陆,和获取公告,这样用户体验会好一些。

c,创建用户唯一的id,因为QIPAI类游戏服务器是世界服,无分区,所以用户的id必须是全局唯一的。可以利用redis的incr方法,原子的递增,如果不想被别人根据userid的递增推算出有多少注册用户,递增的梯度可以随机,比如每次递增的值从1到1024中随机一个。

d,创建房间,当房间主创建房间时,房间的id需要在任何台服务器上可以查询到,所以创建房间成功后,房间id要存储在共享内存redis中,每个房间id对应一个房间所在的ip地址或服务器id.这样,当有用户要进入房间,在查询房间id时,可能判断这个房间是否和自己登陆的游戏服务器相同。

e,查找加入房间

  根据房间id查询房间,查找到房间后,获取房间所在的ip地址或服务器id,如果发现和自己所登陆的服务器一样,直接可以加入房间。如果不一样,把这个房间所在的ip和端口返回给客户端,让客户端重新与房间所在的服务器建立连接,使用登陆时的token验证用户。

f,游戏脚本调用

  在验证游戏是否合法时,客户端与服务器都要验证,验证的算法是一样的,所以可以使用脚本来写,写一份脚本,在服务器与客户端中同时使用。可以使用lua。同一个算法使用同一个脚本 ,这样在开发新的同类型QIPAI游戏时,只需要替换一下这个脚本就行了,不用再重复开发。

2,后台管理系统

  这个一般是根据运营需求开发的,每个公司不一样。不过有一点,后台管理系统可能要和游戏服务器通信,这种通信方式最好是采用redis的订阅/发布机制。这样可以把某个消息事件同时发送到所有的业务服务器上面。根据用户所在的服务器进行处理。

3,玩家同屏

  玩家同屏是QIPAI游戏中的一个重点,对于做过那些大型的arpg,或mmo游戏的程序员来说,这并不是什么难事。因为同屏就是服务器对客户端的消息进行转发。一个房间四个人,一个人出的牌或操作能被其他三个人同时看到。

  因为QIPAI游戏的同步数据量比较小。一般常见的同步方式有两种:

客户端主动拉取

  客户端定时主动向服务器请求一个用户的消息队列,当一个玩家有操作需要同步到其他玩家时,在服务器端先把这个消息放到这个用户的消息队列中。等待客户端的拉取操作。这种方式的好处是,不需要考虑网络闪断或网络不好的情况,信息都是同步获取的。缺点是,定时拉取的时间间隔很短,可能不到一秒就会拉取一次。

服务器主动推送

  当一个用户出牌的消息需要同步给其他玩家时,服务器会获得这个玩家与服务器建立的socket连接,然后服务器使用socket 主动向客户端发送消息。

  这种方式要考虑网络闪断,消息丢失的问题。因为服务器推送的消息,客户端有可能会收不到。所以客户端需要根据心跳来判断网络是否有断开过,如果有断开,需要重新从服务器拉取整个房间状态的消息。或者根据服务器发送的消息号,如果客户端发现接收到的服务器消息号有跳号的,比如应该接收10,却收到了12,说明中间有消息丢失,需要重新拉取整个房间的状态信息。

  这种方式的缺点是,开发复杂,需要考虑一些网络问题。优点是,只有在有消息的时候才会推送,没有的话不推送,不占用带宽等系统资源,可以增加用户同时在线量,也就是增加了服务器的承载量。

4,数据同步和持久化

1,由于QIPAI类的游戏数据少,计算量也小,所以完全可以不使用内存缓存,而直接使用redis共享内存,用户的所有数据都缓存在redis中。更新也同步更新到redis中,这样不管一个用户登陆哪一台业务服务器,都能获得自己的最新数据。

2,更新数据库,由于数据第一缓存是redis,所以活跃的用户数据都是可以从redis中直接获得的,而不用查询数据库,所以数据库的更新可以采取异步更新,而不会产会数据的延迟。需要注意的一点是,数据的异步更新必须保证是有顺序的。那么这就会产生一个问题,怎么保证用户的更新不会乱呢?

3,如何保证更新的顺序性

  因为我们的业务服务器是多个的,用户可能连接其中的任何一个,如果说登陆的是服务器A,加入的房间在服务器B上,那么连接就会切换。为了保证数据更新的顺序,我们可以做一个数据库持久化服务,把需要更新数据库的任务实时发送到这台服务器上,由数据库持久化服务执行对数据库的更新。这样不管用户连接的哪台业务服务器,它的更新都是有顺序保证的。

4,一种快速简单的方法

  由于QIPAI类的业务少,数据更新少,所以查询可以有redis缓存,减少数据库查询的压力,而更新实行实时更新到数据库,前期不需要开发数据库持久化服务。等用户积累到一定程序之后,发现更新数据库比较慢的时候,再单独做一个数据库持久化服务。

  四,服务器架构

1,登陆时,客户端首先向登陆的web服务器请求登陆信息,登陆成功之后,返回登陆的token,为了适应大规模的web请求和登陆服务的稳定,可以使用nginx做负载均衡。

2,登陆成功之后,请求负载均衡服务器,获取一台连接的业务服务器。这个负载均衡服务器可以和登陆web在一个进程中,也可以独立出来。

3,拿到登陆成功的token和需要连接的业务服务器的ip和端口之后,再去连接业务服务器。连接成功之后,要使用token到登陆服务器去验证,这个用户是否登陆了。

4,同一个房间的用户要连接到同一台物理服务器上面。在上面已经说过了。

5,redis用来做共享缓存。

6,mysql做持久化存储。

7,数据库持久化服务器,统一做数据入库操作。

  五,关于网关的问题

1,网关的作用

a,转发消息包

b,业务的负载均衡,比如A业务由服务器a处理,B业务由服务器b处理,由网关进行转发。

c,维护与客户端的连接

d,带宽的整合,一般的云服务都是按购买的服务器计算带宽的。通过一台服务器转发消息,可以只购买一个大带宽就可以了。以节约成本。

2,QIPAI类游戏需要网关吗?

  我认为不太需要,因为QIPAI类游戏业务比较单一,做的最多的就是消息同屏转发。最多是再有一些任务或活动,这些由一台服务器直接处理完全可以搞定。而且开发网关也是一个复杂的工作,没必要在这个上面花太多的时间。

时间: 2024-10-22 02:50:13

简论游戏服务器架构设计的相关文章

棋牌游戏服务器架构设计

转载自:简书一位同行的文章 一,棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间中的人可以接收到其他人的消息. 3,每个房间的操作必须是顺序性 这个特性类似与一般游戏的回合制,每个玩家的操作都是有顺序性的. 二,需要解决的技术点 1,数据共享 因为棋牌类游戏不分区不分服,我们在设计服务器的时候,是按世界服的思想去设计,即服务器是一个n多台物理机的集群

大型多人在线游戏服务器架构设计

由于大型多人在线游戏服务器理论上需要支持无限多的玩家,所以对服务器端是一个非常大的考验.服务器必须是安全的,可维护性高的,可伸缩性高的,可负载均衡的,支持高并发请求的.面对这些需求,我们在设计服务器的时候就需要慎重考虑,特别是架构的设计,如果前期设计不好,最后面临的很可能是重构. 一款游戏服务器的架构都是慢慢从小变大的,不可能一下子就上来一个完善的服务器构架,目前流行的说法是游戏先上线,再扩展.所以说我们在做架构的时候,一定要把底层的基础组件做好,方便以后扩展,但是刚开始的时候留出一些接口,并不

我是如何设计游戏服务器架构的

前言 现在游戏市场分为,pc端,移动端,浏览器端,而已移动端和浏览器端最为接近.都是短平快的特殊模式,不断的开服,合服,换皮.如此滚雪球! 那么在游戏服务器架构的设计方面肯定是以简单,快捷,节约成本来设计的. 来我们看一张图: 这个呢是我了解到,并且在使用的方式,而PC端的游戏服务器而言,往往是大量的数据处理和大量的人在线,一般地图也是无缝地图的完整世界观,所以不同的程序都是独立的进程并且在不同的server中运行! 而浏览器端和移动终端,在上面就说过了,它主要是不断的开服,合服,开服,合服,那

微信房卡麻将棋牌架设之游戏服务器架构的详细设计(一) 内核设计

题目:微信房卡麻将棋牌架设之游戏服务器架构的详细设计(一) 内核设计 今天向大家介绍一下游戏服务器的设计,着重讲解一下微信房卡麻将棋牌架设(aqiulian.com)的服务器搭建,如果有什么不懂得可以咨询我Q_212303635,欢迎大家的咨询.那么我们开始进去主题吧. 内核的几个组件被设计成Service,也就是说这几个模块都要实现如下接口: 图1  IService接口 Start方法用来启动服务. Stop 方法用来关闭服务. IsService 方法用于查询当前服务是否正在工作. 内核中

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

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

游戏服务器架构概要

声明:本文内容源自腾讯游戏学院程序公开课_服务器第二节 一.服务器架构概念解析 1,什么是“服务器架构” 对服务器软件&硬件&运行的一体化规划 框架结构:分层分块. 构建技术选择:编程语言:通信方式:存储技术. 运行质量:运行环境:部署工具方法:更新方案. 二.案例讲解:分布式服务架构设计演讲——MMORPG(大型多人在线角色扮演)<轩辕传奇> 服务器架构_分区多世界 1,运营视角 世界与世界是隔离的 世界之间的互通方式:跨服.转服.合服 2,运维视角 SET部署:每开一组服就

游戏服务器架构的思考

时间总是在不经意的时候就流走了,突然回想我已经做了四年游戏开发,经历了几个游戏项目,以前项目中的游戏服务器框架都不是我心中理想的框架,虽然不知道是不是我见识还不够.下面记录下我对游戏服务器架构的简单思考.好的游戏框架可以提高开发效率,节省人力成本.首先最简单的服务器框架,那就是只要一个网关和一个游戏服务器.如图: 图中agentserver负责客户端连接,客户端收发数据,将客户端数据转发给服务器,将服务器数据转发给客户端,几乎没有逻辑,这样可以应对大并发io.所以agent可以采用一个epoll

棋牌游戏服务器架构: 详细设计(二) 应用层设计

这里的应用层,指的是CenterServer.LogonServer.LogServer.RoomServer等几个服务器,另外还包括游戏模块的设计.不过游戏模块和前4个服务器的设计很不相同.这里先说一下服务器应用的详细设计. 这上面提到的4个服务器都需要响应客户端(这里的客户端的意思是泛指)的请求,进行数据库操作,同时还要能够配置,以及显示系统运行的状态信息等.这里会采用MVC模式来组织应用层逻辑 . 图1  Application层基本结构 IController从ITCPServiceOb

H5十人牛牛架设游戏服务器架构: 内核设计

H5十人牛牛架设游戏服务器查看(aqiulian.com),内核设计分析Q_212303635:接下来讲解一下内核模块分析.内核的几个组件被设计成Service,也就是说这几个模块都要实现如下接口: 图1  IService接口 Start方法用来启动服务. Stop 方法用来关闭服务. IsService 方法用于查询当前服务是否正在工作. 内核中的几个Service都不能够直接创建,Applications在使用这些Service的时候首先要得到一个IServiceMgr的实例,这被实现成了