查看: 144|回复: 1

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

[复制链接]

8

主题

36

帖子

220

积分

vip会员

Rank: 1

积分
220
发表于 2020-3-27 15:54:46 | 显示全部楼层 |阅读模式

内核的几个组件被设计成Service,也就是说这几个模块都要实现如下接口:

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

图1  IService接口

      Start方法用来启动服务。

      Stop 方法用来关闭服务。

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

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

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

图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详细设计

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

图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详细设计

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

图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,而是取消先前的定时器。修            改其参数后启动。

回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | enginedx注册

本版积分规则

 
 



邮件留言:


 
返回顶部