若有錯誤的地方,請同仁指正,很是感謝mysql
第一種方式: sql
共3個進程數據庫
Login: 登錄服(同時用於聊天系統) socket長鏈接服務器
Game: 遊戲服(遊戲邏輯處理) http短鏈接網絡
Mysql: 數據庫回寫 socket併發
客戶端socket鏈接login,保持長鏈接,驗證成功後,向game服以http方式請求數據socket
game服向login服http方式驗證該客戶端是否已經正常登錄, 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服使用uid向login服經過http方式驗證客戶端是否已經登錄成功. 1:沒有登陸則提醒登錄 2.已經登錄,則處理邏輯數據 (這裏有個問題,game與login直接的驗證會很是頻繁)
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秒請求檢查標誌位狀態,有新數據則獲取.
以上兩種方式,其中數據傳輸該加密的方式則須要加密.
本人新手,求達人指正