棋牌遊戲伺服器架構 詳細設計 一 核心設計

2021-06-09 13:38:23 字數 4020 閱讀 3895

核心的幾個元件被設計成service,也就是說這幾個模組都要實現如下介面:

圖1  iservice介面

start方法用來啟動服務。

stop 方法用來關閉服務。

isservice 方法用於查詢當前服務是否正在工作。

圖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的實現組合在了一起,所以它的實現不會詳細描述。

圖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。

圖4  timerservice的結構圖

timerservice實現了iservice和itimerservice介面。itimerservice提供如下介面:

1) settimer(timerid,milisecs,timerfunc,repeattimes)    設定乙個id為timerid的定時器,這個定時器會被激           

發repeattimes次,每兩次被小激發的時間間隔為millsecs毫秒。每次被激發都會呼叫 timerfunc這個函式。

2) killtimer(timerid)   取消id為timerid的定時器。

3) killalltimer()           取消所有的定時器,一般用在系統關閉時呼叫。

需要注意以下幾點:

1) 傳給settimer的timerfunc這個函式要是執行緒安全的,因為不確定會在哪個工作執行緒的context中呼叫它,同時             如果你的好幾個定時器公用同乙個timerfunc, 就可能對共享資源造成競爭。

2) settimer進如果發現已經存在相同id的timeritem, 不會建立乙個新的timeritem,而是取消先前的定時器。修            改其引數後啟動。

圖5  tcpserverservice結構圖

tcpserverservice實現了iservice介面和itcpserverservice介面。itcpserverservice的幾個主要介面說明:

1) senddata  通過指定的isocketitem傳送資料, 資料在一般情況下由4個引數: maincmd, subcmd, data, datasize (可以參與總休設計中關於協議的部分的描述) 。有的時候data為空,就不需要data和datasize這兩個引數了。

2) senddatabatch 給所有連線傳送資料。這是批量傳送的,所有連線池中對應的客戶端都會收到。

3) closesocket  關閉指定的連線。

4) setobserver 設定監聽者。用以接收非同步通知。

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。

圖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物件。你可以通過它知道查詢的狀態,以及結果資訊。

棋牌遊戲伺服器架構 詳細設計 一 核心設計

核心的幾個元件被設計成service,也就是說這幾個模組都要實現如下介面 圖1 iservice介面 start方法用來啟動服務。stop 方法用來關閉服務。isservice 方法用於查詢當前服務是否正在工作。圖2 iservicemgr介面 iservicemgr提供兩類介面 1 獲取servi...

棋牌遊戲伺服器架構設計

一,棋牌類伺服器的特點 1,棋牌類不分割槽不分服 一般來說,棋牌遊戲都是不分割槽不分服的。所以棋牌類伺服器要滿足隨著使用者量的增加而擴充套件的需要。2,房間模式 即在同一局遊戲中就是在同乙個房間中,同乙個房間中的人可以接收到其他人的訊息。3,每個房間的操作必須是順序性 這個特性類似與一般遊戲的回合制...

棋牌遊戲伺服器架構 詳細設計 三 資料庫設計

標籤 遊戲 資料庫伺服器 儲存database加密 2012 09 16 12 35 5612人閱讀收藏 舉報 棋牌遊戲架構 4 目錄 主要有3類database serverinfodb,userinfodb和gamedb。serverinfodb主要儲存的是遊戲列表的資訊,userinfodb儲...