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

H5十人牛牛架设游戏服务器查看(aqiulian.com),内核设计分析Q_212303635;接下来讲解一下内核模块分析。内核的几个组件被设计成Service,也就是说这几个模块都要实现如下接口:

图1  IService接口

Start方法用来启动服务。

Stop 方法用来关闭服务。

IsService 方法用于查询当前服务是否正在工作。

内核中的几个Service都不能够直接创建,Applications在使用这些Service的时候首先要得到一个IServiceMgr的实例,这被实现成了一个另类地单例模式。IServiceMgr的接口定义如下:

图2  IServiceMgr接口

IServiceMgr提供两类接口:

1) 获取Service的接口,这样直接得到具体的Service,是因为内核的Service比较固定。没有必要用GetService(strServiceName)这种方法。

GetAsyncService    返回AsyncService的实例

GetDBService        返回DatabaseService的实例

GetTCPService       返回TCPServerService的实例

GetTimerService    返回定时器实例

2) 一个静态的单例方法Instance。它申明在接口层,但是需要在IServiceMgr的实现中去实现它。它返回IServiceMgr的实例。

由于IServiceMgr的实现只是简单地将IAttemptService,ITCPServerServer, IDatabaseService,ITimerService的实现组合在了一起,所以它的实现不会详细描述。

1 AsyncService详细设计

图3  AsyncService的详细设计

AsyncService主要是提供给其他3个Service使用的,它实现了IService接口和IAsyncService接口。因为与异步相关的功能基本上都被boost::asio实现,所以AsyncService主要只是管理boost::asio的实例 。IAsyncService只提供了一个方法:

GetIOService      返回一个可用的boost::asio::io_service的实例

AsyncService组合了boost::asio和ThreadPool,其中boost::asio::io_service的数目和机器的cpu总数相同,而ThreadPool中线程总数为2倍的cpu数。所有ThreadPool中的线程都将作为工作线程,它们的入口函数都是io_service::run。

2 TimerService详细设计

图4  TimerService的结构图

TimerService实现了IService和ITimerService接口。ITimerService提供如下接口:

1) SetTimer(timerId,milisecs,timerFunc,repeatTimes)    设置一个id为timerId的定时器,这个定时器会被激

发repeatTimes次,每两次被小激发的时间间隔为millsecs毫秒。每次被激发都会调用 timerFunc这个函数。

2) KillTimer(timerId)   取消id为timerId的定时器。

3) KillAllTimer()           取消所有的定时器,一般用在系统关闭时调用。

TimerService管理着一些TimerItem,Applications层用一个新的timerId,调用SetTimer时,TimerService就会创建一个新的TimerItem, 而在调用KillTimer时,就会销毁掉与其相关的那个TimerItem。TimerService的实现依赖与AsyncService,因为定时器本质上也是异步操作。将由AsyncService中的io_service来统一调度。

需要注意以下几点:

1) 传给SetTimer的timerFunc这个函数要是线程安全的,因为不确定会在哪个工作线程的context中调用它,同时如果你的好几个定时器公用同一个timerFunc, 就可能对共享资源造成竞争。

2) SetTimer进如果发现已经存在相同id的TimerItem, 不会创建一个新的TimerItem,而是取消先前的定时器。修改其参数后启动。

3 TCPServerService详细设计

图5  TCPServerService结构图

TCPServerService实现了IService接口和ITCPServerService接口。ITCPServerService的几个主要接口说明:

1) SendData  通过指定的ISocketItem发送数据, 数据在一般情况下由4个参数: MainCmd, SubCmd, Data, DataSize (可以参与总休设计中关于协议的部分的描述) 。有的时候Data为空,就不需要Data和DataSize这两个参数了。

2) SendDataBatch 给所有连接发送数据。这是批量发送的,所有连接池中对应的客户端都会收到。

3) CloseSocket  关闭指定的连接。

4) SetObserver 设置监听者。用以接收异步通知。

TCPServerService 管理着一个客户端来的连接池。这个连接池由SocketItem组成,每一个SocketItem都与一个整数标识对应,Applications使用这个标识来发送数据和接收数据。SocketItem主要提供下面几个接口:

1) GetIndex    获取与其对应的唯一标识

2) GetRound   由于每个SocketItem都是可以重用的,所以为了防止混乱,比如说一个SocketItem在前一时刻对应着client1, 但是现在对应着client2。client1曾经的一个请求现在才要返回,这时如果没有GetRound就会把client1的处理结果错误地返回给client2。从这里也可以看出,每个SocketItem的round是在连接建立的时候会增加。

3) IsConnected  是否处于连接状态。

4) SendData  发送数据。

5) GetClientAddress 得到客户端的IP地址

6) GetConnectTimer 获取连接时间。

7) Close  关闭连接。

也许你会问了,我怎么只看到发送数据的接口,而没有接收数据的接口呢?因为这是个异步架构,在有连接到来,或者数据到来的时候,你会收到通知的。前提条件是你调用SetObserver设置了监听者。TCPServerService的监听都需要实现ITCPServiceObserver接口, TCPServerService通过这个接口提供的方法来通知你连接和读取事件:

1) OnSocketAccept  在新连接到达时,会调用你这里面的内容。

2) OnSocketRead  在数据读取完成后,会调用你提供的这个方法做进一步处理。

3) OnSocketClose  告诉你连接将要关闭。

需要注意的是如果你这三个方法中有共享的数据,要加锁保护。因为工作线程可能会产生竞争状态。

和TimerService一样,TCPServerService的异步调度依赖于IAsyncService。

4 DatabaseService详细设计

图6  DatabaseService结构图

可以对比一下DatabaseService和TCPServerService的结构图,你会发现他们是那么地相似。对的,它们的设计思路如出一辙。DatabaseService实现了IService和IDatabaseService这两个接口。IDatabaseService主要只提供了3个接口:

1) Connect  连接到一个数据库

2) Query   进行查询。 这里有两点要注意:1) Query以后不会立马得到结果,因为这是异步的; 2) 存储过程的调用也得使用这个方法,你只要将query语句写成 ‘select stroage_procedure(param1,param2,...)‘ 就行了。

3) SetObserver 设置观察者。因为查询是异步的,所以你要设一个观察者来得到通知。

DatabaseService管理着一些数据库连接DBConnect, 每一个DBConnect也与一个整数标识相关联,可以通过GetIndex获得。同时你可以通过IsConnect来查询这个DBConnect是否处于连接状态。

在实现IDBServiceObserver时,你需要实现下面两个方法:

1) OnDBConnect  在数据库连接建立时会调用

2) OnQueryEnd  在这里你可以得到一个表示查询结果的QueryResult对象。你可以通过它知道查询的状态,以及结果信息。

原文地址:https://www.cnblogs.com/Meboke/p/8459392.html

时间: 2024-10-08 08:52:48

H5十人牛牛架设游戏服务器架构: 内核设计的相关文章

h5熟人棋牌系统架设平台服务器架构设计分析

h5熟人棋牌系统架设(aqiulian.com/h5),QQ咨询212303635模仿COM组件接口模式,利用面向对象思想多态性polymorphism,调用方保存着被调用方的基础接口指针(interface or sink钩子)(Pure Virtual Function),调用方直接调用接口指针内声明的纯虚方法,而此纯虚函数的具体逻辑由该接口的派生类实现. 示意图: 基于事件驱动的数据处理模型 在系统功能设计中,针对网络事件SocketEvent.数据库事件DatabaseEvent.定时器

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

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

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

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

游戏服务器架构概要

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

游戏服务器架构的思考

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

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

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

棋牌游戏服务器架构: 部署

先看一下,下面这张可能的部署图吧. 在这个图中,可以看到,客户端的形式多种多样,可能是pc上的一个可执行文件,也可能是通过浏览器打开的一个网页,甚至于手机客户端.它们都通过internet连接到游戏服务器. 在这个部署中有1个CenterServer,1个LogServer,3个LogonServer和很多个RoomServer(只显示了德州扑克的两个房间).这些Server有可能分布在同一台机器上,也可以分布在不同的机器之上.这对扩容来说是极为方便地.在玩家数量增大,系统不足以承载其网络负载时

棋牌游戏服务器架构设计

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

简论游戏服务器架构设计

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