文档章节

棋牌游戏服务器架构: 详细设计(1) 内核设计

棋牌游戏服务器托管
 棋牌游戏服务器托管
发布于 2015/11/30 14:13
字数 1691
阅读 57
收藏 0

 内核的几个组件被设计成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对象。你可以通过它知道查询的状态,以及结果信息。

© 著作权归作者所有

共有 人打赏支持
棋牌游戏服务器托管
粉丝 2
博文 16
码字总数 19114
作品 0
香港
项目经理
私信 提问
北京金智航软件研发有限公司 招聘 工作地点:北京

北京金智航软件研发有限公司 招聘信息 由致力于中国网络游戏与动漫事业的有识之士,投资千万元在北京成立动漫游戏及周边产品研发运营公司,初期先以工作室形式进行棋牌游戏项目开发,主要开发...

kqzj
2011/01/06
443
7
房卡棋牌游戏如何开发运营,需要多少钱

  房卡棋牌游戏从开发到运营的步骤介绍:   1、市场调研:对棋牌游戏市场趋势、竞争对手进行调研,为定制房卡游戏APP开发和设计提供参考。需要了解市面上有哪些棋牌游戏,哪些棋牌游戏赚...

壹柒游棋牌开发
2017/12/14
0
0
棋牌游戏服务器架构: 总体设计

首先要说明的是, 这个棋牌游戏的服务器架构参考了网狐棋牌的架构。网狐棋牌最令人印象深刻的是其稳定性和高网络负载。它的一份压力测试报告上指出:一台双核r的INTEL Xeon 2.8CPU加上2G内存和...

棋牌游戏服务器托管
2016/11/01
84
0
棋牌游戏开发不可忽视的三个重点内容

  作为专业的棋牌游戏开发商,壹柒游来谈谈棋牌游戏开发的几个步骤,以及不可忽视的几个重点。只有脚踏实地逐步去做,一个成功的棋牌游戏才能面向玩家。   1.确定需求:棋牌游戏的开发要...

壹柒游棋牌开发
2017/12/05
0
0
棋牌游戏服务器架构: 详细设计(2) 应用层设计

这里的应用层,指的是CenterServer、LogonServer、LogServer、RoomServer等几个服务器,另外还包括游戏模块的设计。不过游戏模块和前4个服务器的设计很不相同。这里先说一下服务器应用的详细...

棋牌游戏服务器托管
2015/11/30
285
0

没有更多内容

加载失败,请刷新页面

加载更多

JS 调用Angularjs 的方法

// 1. 获取 Controllerlet appElement = document.querySelector('[data-ng-controller=MessagesCtrl]');let scope = angular.element(appElement).scope();// 2. 调用方法scope.l......

Moks角木
37分钟前
2
0
dubbo+zookeeper与 eureka的区别

CAP CAP 原则指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得 在分布式架构里, P必须有 Zookeeper保证C P 当...

群星纪元
46分钟前
4
0
云计算之边缘计算大势所趋

如果说边缘计算是公同认定的目标,那么我们看到,不同类型的厂商基于自身的特点,会从不同的起点、沿着不同的路径,向这个目标奔跑。上次参加阿里云的一次活动,看到他们将边缘计算的厂商分成...

linuxCool
51分钟前
1
0
前端通过后端传过来的'\n' ,''等字符串换行失败问题

后台推送换行符 '\n' 或 '<br/>' 等字符串到前台不会换行 详细描述 后台逻辑处理返回String字符串,其中包含\n或<br/>等换行符号,但是前端渲染时候却并没有真正的换行 也尝试了大佬的各种 ...

下次用oschina
58分钟前
2
0
volatile能保证有序性吗?

在前面提到volatile关键字能禁止指令重排序,所以volatile能在一定程度上保证有序性。   volatile关键字禁止指令重排序有两层意思:   1)当程序执行到volatile变量的读操作或者写操作时...

无精疯
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部