golang 手遊框架設計 - 本人淺陋的看法, 求達人指正

若有錯誤的地方,請同仁指正,很是感謝mysql

第一種方式: sql

3個進程數據庫

Login: 登錄服(同時用於聊天系統)  socket長鏈接服務器

Game: 遊戲服(遊戲邏輯處理)  http短鏈接網絡

Mysql: 數據庫回寫 socket併發

 

客戶端socket鏈接login,保持長鏈接,驗證成功後,game服以http方式請求數據socket

game服向loginhttp方式驗證該客戶端是否已經正常登錄, 1: 沒有登陸則,game返回數據給客戶,沒有登陸狀態. 2: 已經登錄,game返回所需數據給客戶端.優化

game將修改後的數據以sql語句形式發送給mysql,同時記錄當前sql到文件中用於備查.ui

 

使用單獨login服的好處在於 客戶端能夠一直保持鏈接,而且login服邏輯處理少. 服務器壓力小.同時在game服有問題須要閃斷時,還能繼續保持玩家登錄狀態,在緊急更新game服後,客戶端不須要從新鏈接登錄遊戲. 而且由於login較少的邏輯處理, 各個socket共存鏈接能力相應變強.能夠提升同時在線玩家數. 使用socket鏈接,便於服務端主動向客戶端發送聊天,公告等信息.  game服鏈接方式不一樣,主要是由於兩個進程間功能不一樣致使.加密

 

game服使用http方式,http處理能力相較於socket更好,使用更方便,基本不須要去考慮網絡鏈接的狀態問題.客戶端須要什麼數據,能夠直接Get請求. 對於每次請求數據,都是單獨一個go, http併發處理也會更好.

 

具體實現:

login只讀取玩家的Account信息用於驗證.不生成新sql數據. 若是新用戶登錄,則生成一份臨時數據用於表示新用戶登錄成功.返回給客戶端一個uid.做爲客戶端登錄的標記. 客戶端向game服請求數據時,再由game生成sql數據,同時get方式通知login服臨時數據爲永久數據. sql語句通知mysql服回寫數據.

客戶端每次向game請求數據都須要帶上參數uid, game服使用uidlogin服經過http方式驗證客戶端是否已經登錄成功. 1:沒有登陸則提醒登錄 2.已經登錄,則處理邏輯數據  (這裏有個問題,gamelogin直接的驗證會很是頻繁)

 

game的數據處理,則使用內存共享方式.

game服啓動時將mysql數據庫中的數據所有讀取到內存中. 結構以下:

type UserData struct{//單個玩家的結構數據

         Account Account //單個玩家的帳號信息,元寶,銅錢等屬性

         Bag []Bag //單個玩家的揹包物品數據. 多個物品

         Friend []Friend //單個玩家的好友 多個好友

         ....

         mu    sync.RWMutex //單個玩家的數據鎖

}

UserDatas = make(map[int32]UserData)  //全服全部玩家數據

 

type Shop struct{ //商店表 配置表

         ....

}

ShopInfo = make(map[int32] Shop) //商店的配置表數據

 

......

說明a: 玩家的信息,統一放在UserData,多條數據使用slice結構,儘可能減小"對象"數量.

不能統一的數據則單獨一個結構.

 

game服在遊戲過程當中,只要數據變化則生成優化後的sql語句,通知mysql服回寫到數據庫

 

mysql只負責接收sql語句, 並寫入到數據庫,記錄下當前寫成功的sql語句第幾條.用於數據出錯時. 對比sql文件,已經寫到哪一條語句.便於恢復數據庫. 若是一旦數據回寫錯誤,則中止接下去的語句回寫, 須要記錄下後續語句的數量便可, 並立刻通知dba管理員.

 

說明b: 若是一個玩家操做須要影響到其它玩家,則由game服請求login,login服主動通知客戶端數據.免去了客戶端定時請求某些操做的麻煩.

例如: A玩家在地圖上移動,須要通知周邊其它玩家,A玩家新的座標點. 此時由game服請求login,login服通知在線玩家A的新數據.

 

第二種方式:

http鏈接.

game: http鏈接

mysql:數據回寫處理.

 

A玩家向game請求登錄,game驗證成功後,記錄A玩家登錄成功,並返回給客戶端uid.則此後3分鐘都認爲該uid的玩家處於登錄狀態. A客戶端每次請求數據都更新A玩家的最後時間.

其中uid爲加密後的數據. 每次從新驗證則生成不一樣的uid.

http的弊端: 服務器不能實時通知客戶端信息.

遊戲中創建玩家數據更新標誌位. A玩家定時2-5秒請求公告標誌位,發現公告標誌位是新的,則讀取.

A玩家移動,須要通知其它周邊玩家, 則向其它玩家的移動處理隊列中添加新數據,並更新通知標誌位, B玩家每1-2秒請求檢查標誌位狀態,有新數據則獲取.

 

 

以上兩種方式,其中數據傳輸該加密的方式則須要加密.

本人新手,求達人指正

相關文章
相關標籤/搜索