核心的幾個元件被設計成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儲...