日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/4/11 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 棋牌游戏服务器架构: 详细设计(一) 内核设计 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

內(nèi)核的幾個(gè)組件被設(shè)計(jì)成Service,也就是說這幾個(gè)模塊都要實(shí)現(xiàn)如下接口:

圖1 ?IService接口

? ? ? Start方法用來啟動(dòng)服務(wù)。

? ? ? Stop 方法用來關(guān)閉服務(wù)。

? ? ? IsService 方法用于查詢當(dāng)前服務(wù)是否正在工作。

? ? ??內(nèi)核中的幾個(gè)Service都不能夠直接創(chuàng)建,Applications在使用這些Service的時(shí)候首先要得到一個(gè)IServiceMgr的實(shí)例,這被實(shí)現(xiàn)成了一個(gè)另類地單例模式。IServiceMgr的接口定義如下:

圖2 ?IServiceMgr接口

? ? ? IServiceMgr提供兩類接口:

? ? ? 1) 獲取Service的接口,這樣直接得到具體的Service,是因?yàn)閮?nèi)核的Service比較固定。沒有必要用GetService(strServiceName)這種方法。

? ? ? ? ? GetAsyncService ? ?返回AsyncService的實(shí)例

? ? ? ? ? GetDBService ? ? ? ?返回DatabaseService的實(shí)例

? ? ? ? ? GetTCPService ? ? ? 返回TCPServerService的實(shí)例

? ? ? ? ? GetTimerService ? ?返回定時(shí)器實(shí)例

? ? ? ?2) 一個(gè)靜態(tài)的單例方法Instance。它申明在接口層,但是需要在IServiceMgr的實(shí)現(xiàn)中去實(shí)現(xiàn)它。它返回IServiceMgr的實(shí)例。

? ? ? 由于IServiceMgr的實(shí)現(xiàn)只是簡單地將IAttemptService,ITCPServerServer, IDatabaseService,ITimerService的實(shí)現(xiàn)組合在了一起,所以它的實(shí)現(xiàn)不會(huì)詳細(xì)描述。

1 AsyncService詳細(xì)設(shè)計(jì)

圖3 ?AsyncService的詳細(xì)設(shè)計(jì)

? ? ? AsyncService主要是提供給其他3個(gè)Service使用的,它實(shí)現(xiàn)了IService接口和IAsyncService接口。因?yàn)榕c異步相關(guān)的功能基本上都被boost::asio實(shí)現(xiàn),所以AsyncService主要只是管理boost::asio的實(shí)例 。IAsyncService只提供了一個(gè)方法:

? ? ? GetIOService ? ? ?返回一個(gè)可用的boost::asio::io_service的實(shí)例

? ? ? AsyncService組合了boost::asio和ThreadPool,其中boost::asio::io_service的數(shù)目和機(jī)器的cpu總數(shù)相同,而ThreadPool中線程總數(shù)為2倍的cpu數(shù)。所有ThreadPool中的線程都將作為工作線程,它們的入口函數(shù)都是io_service::run。

2 TimerService詳細(xì)設(shè)計(jì)

圖4 ?TimerService的結(jié)構(gòu)圖

? ? ? TimerService實(shí)現(xiàn)了IService和ITimerService接口。ITimerService提供如下接口:

? ? ? ?1) SetTimer(timerId,milisecs,timerFunc,repeatTimes) ? ?設(shè)置一個(gè)id為timerId的定時(shí)器,這個(gè)定時(shí)器會(huì)被激 ? ? ? ? ??

? ? ? ? ? ?發(fā)repeatTimes次,每兩次被小激發(fā)的時(shí)間間隔為millsecs毫秒。每次被激發(fā)都會(huì)調(diào)用 timerFunc這個(gè)函數(shù)。

? ? ? ?2) KillTimer(timerId) ? 取消id為timerId的定時(shí)器。

? ? ? ?3) KillAllTimer() ? ? ? ? ? 取消所有的定時(shí)器,一般用在系統(tǒng)關(guān)閉時(shí)調(diào)用。

? ? ? ?TimerService管理著一些TimerItem,Applications層用一個(gè)新的timerId,調(diào)用SetTimer時(shí),TimerService就會(huì)創(chuàng)建一個(gè)新的TimerItem, 而在調(diào)用KillTimer時(shí),就會(huì)銷毀掉與其相關(guān)的那個(gè)TimerItem。TimerService的實(shí)現(xiàn)依賴與AsyncService,因?yàn)槎〞r(shí)器本質(zhì)上也是異步操作。將由AsyncService中的io_service來統(tǒng)一調(diào)度。 ? ? ?

? ? ? ?需要注意以下幾點(diǎn):

? ? ? ? 1) 傳給SetTimer的timerFunc這個(gè)函數(shù)要是線程安全的,因?yàn)椴淮_定會(huì)在哪個(gè)工作線程的context中調(diào)用它,同時(shí)? ? ? ? ? ? ?如果你的好幾個(gè)定時(shí)器公用同一個(gè)timerFunc, 就可能對(duì)共享資源造成競爭。

? ? ? ? 2) SetTimer進(jìn)如果發(fā)現(xiàn)已經(jīng)存在相同id的TimerItem, 不會(huì)創(chuàng)建一個(gè)新的TimerItem,而是取消先前的定時(shí)器。修? ? ? ? ? ? 改其參數(shù)后啟動(dòng)。

3 TCPServerService詳細(xì)設(shè)計(jì)

圖5? TCPServerService結(jié)構(gòu)圖

? ? ? TCPServerService實(shí)現(xiàn)了IService接口和ITCPServerService接口。ITCPServerService的幾個(gè)主要接口說明:

? ? ? 1) SendData ?通過指定的ISocketItem發(fā)送數(shù)據(jù), 數(shù)據(jù)在一般情況下由4個(gè)參數(shù): MainCmd, SubCmd, Data, DataSize (可以參與總休設(shè)計(jì)中關(guān)于協(xié)議的部分的描述) 。有的時(shí)候Data為空,就不需要Data和DataSize這兩個(gè)參數(shù)了。

? ? ? 2) SendDataBatch 給所有連接發(fā)送數(shù)據(jù)。這是批量發(fā)送的,所有連接池中對(duì)應(yīng)的客戶端都會(huì)收到。

? ? ? 3) CloseSocket ?關(guān)閉指定的連接。

? ? ? 4) SetObserver 設(shè)置監(jiān)聽者。用以接收異步通知。

? ? ? TCPServerService?管理著一個(gè)客戶端來的連接池。這個(gè)連接池由SocketItem組成,每一個(gè)SocketItem都與一個(gè)整數(shù)標(biāo)識(shí)對(duì)應(yīng),Applications使用這個(gè)標(biāo)識(shí)來發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。SocketItem主要提供下面幾個(gè)接口:

? ? ? 1) GetIndex ? ?獲取與其對(duì)應(yīng)的唯一標(biāo)識(shí)

? ? ? 2) GetRound ? 由于每個(gè)SocketItem都是可以重用的,所以為了防止混亂,比如說一個(gè)SocketItem在前一時(shí)刻對(duì)應(yīng)著client1, 但是現(xiàn)在對(duì)應(yīng)著client2。client1曾經(jīng)的一個(gè)請(qǐng)求現(xiàn)在才要返回,這時(shí)如果沒有GetRound就會(huì)把client1的處理結(jié)果錯(cuò)誤地返回給client2。從這里也可以看出,每個(gè)SocketItem的round是在連接建立的時(shí)候會(huì)增加。

? ? ? 3) IsConnected ?是否處于連接狀態(tài)。

? ? ? 4) SendData ?發(fā)送數(shù)據(jù)。

? ? ? 5) GetClientAddress 得到客戶端的IP地址

? ? ? 6) GetConnectTimer 獲取連接時(shí)間。

? ? ? 7) Close ?關(guān)閉連接。

? ? ? 也許你會(huì)問了,我怎么只看到發(fā)送數(shù)據(jù)的接口,而沒有接收數(shù)據(jù)的接口呢?因?yàn)檫@是個(gè)異步架構(gòu),在有連接到來,或者數(shù)據(jù)到來的時(shí)候,你會(huì)收到通知的。前提條件是你調(diào)用SetObserver設(shè)置了監(jiān)聽者。TCPServerService的監(jiān)聽都需要實(shí)現(xiàn)ITCPServiceObserver接口, TCPServerService通過這個(gè)接口提供的方法來通知你連接和讀取事件:

? ? ? 1) OnSocketAccept ?在新連接到達(dá)時(shí),會(huì)調(diào)用你這里面的內(nèi)容。

? ? ? 2) OnSocketRead ?在數(shù)據(jù)讀取完成后,會(huì)調(diào)用你提供的這個(gè)方法做進(jìn)一步處理。

? ? ? 3) OnSocketClose ?告訴你連接將要關(guān)閉。

? ? ? 需要注意的是如果你這三個(gè)方法中有共享的數(shù)據(jù),要加鎖保護(hù)。因?yàn)楣ぷ骶€程可能會(huì)產(chǎn)生競爭狀態(tài)。

? ? ? 和TimerService一樣,TCPServerService的異步調(diào)度依賴于IAsyncService。

?4 DatabaseService詳細(xì)設(shè)計(jì)

圖6 ?DatabaseService結(jié)構(gòu)圖

? ? ? 可以對(duì)比一下DatabaseService和TCPServerService的結(jié)構(gòu)圖,你會(huì)發(fā)現(xiàn)他們是那么地相似。對(duì)的,它們的設(shè)計(jì)思路如出一轍。DatabaseService實(shí)現(xiàn)了IService和IDatabaseService這兩個(gè)接口。IDatabaseService主要只提供了3個(gè)接口:

? ? ? 1) Connect ?連接到一個(gè)數(shù)據(jù)庫

? ? ? 2) Query ? 進(jìn)行查詢。 這里有兩點(diǎn)要注意:1) Query以后不會(huì)立馬得到結(jié)果,因?yàn)檫@是異步的; 2) 存儲(chǔ)過程的調(diào)用也得使用這個(gè)方法,你只要將query語句寫成 'select stroage_procedure(param1,param2,...)' 就行了。

? ? ? 3) SetObserver 設(shè)置觀察者。因?yàn)椴樵兪钱惒降?#xff0c;所以你要設(shè)一個(gè)觀察者來得到通知。

? ? ? DatabaseService管理著一些數(shù)據(jù)庫連接DBConnect, 每一個(gè)DBConnect也與一個(gè)整數(shù)標(biāo)識(shí)相關(guān)聯(lián),可以通過GetIndex獲得。同時(shí)你可以通過IsConnect來查詢這個(gè)DBConnect是否處于連接狀態(tài)。

? ? ? ?在實(shí)現(xiàn)IDBServiceObserver時(shí),你需要實(shí)現(xiàn)下面兩個(gè)方法:

? ? ? ?1) OnDBConnect ?在數(shù)據(jù)庫連接建立時(shí)會(huì)調(diào)用

? ? ? ?2) OnQueryEnd ?在這里你可以得到一個(gè)表示查詢結(jié)果的QueryResult對(duì)象。你可以通過它知道查詢的狀態(tài),以及結(jié)果信息。

總結(jié)

以上是生活随笔為你收集整理的棋牌游戏服务器架构: 详细设计(一) 内核设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。