天天看點

遊戲伺服器設計

遊戲伺服器系統設計

1.1 伺服器架構分類

伺服器組的架構一般分為兩種:第一種是帶網關伺服器的伺服器架構;第二種是不帶網關伺服器的伺服器架構,這兩種方案各有利弊。在給出伺服器架構設計之前,先對這兩種設計方案進行詳細的探讨。所謂網關伺服器,其實是gate 伺服器,比如logingate、gamegate 等。網關伺服器的主要職責是将用戶端和遊戲伺服器隔離,用戶端程式直接與這些網關伺服器通信,并不需要知道具體的遊戲伺服器内部架構,包括它們的ip、端口、網絡通信模型(完成端口或epoll)等。用戶端隻與網關伺服器相連,通過網關伺服器轉發資料包廂接地與遊戲伺服器互動。同樣地,遊戲伺服器也不直接和用戶端通信,發給用戶端的協定都通過網關伺服器進行轉發。

1.2 伺服器架構設計

根據網絡遊戲的規模和設計的不同,每組伺服器中伺服器種類和數量是不盡相同的。本系統設計出的帶網關伺服器的伺服器組架構如圖1 所示。

遊戲伺服器設計

圖1 帶網關伺服器的伺服器架構設計方案

該設計有以下幾點好處:

(1)作為網絡通信的中轉站,負責維護将内網和外網隔離開,使外部無法直接通路内部伺服器,保障内網伺服器的安全,一定程度上較少外挂的攻擊。

(2)網關伺服器負責解析資料包、加解密、逾時處理和一定邏輯處理,這樣可以提前過濾掉錯誤包和非法資料包。

(3)用戶端程式隻需建立與網關伺服器的連接配接即可進入遊戲,無需與其它遊戲伺服器同時建立多條連接配接,節省了用戶端和伺服器程式的網絡資源開銷。

(4)在玩家跳伺服器時,不需要斷開與網關伺服器的連接配接,玩家資料在不同遊戲伺服器間的切換是内網切換,切換工作瞬間完成,玩家幾乎察覺不到,這保證了遊戲的流暢性

和良好的使用者體驗。

雖然網關伺服器帶來上述好處,但是,還需要注意以下可能導緻負面效果的兩個情況:如何避免網關伺服器成為高負載情況下的通訊瓶頸問題以及由于網關的單節點故障導緻整組伺服器無法對外提供服務的問題。上述兩個問題可以采用“多網關” 技術加以解決。顧名思義,“多網關” 就是同時存在多個網關伺服器,比如一組伺服器可以配置三台gamegate。當負載較大時,可以通過增加網關伺服器來增加網關的總體通訊流量,當一台網關伺服器當機時,它隻會影響連接配接到本伺服器的用戶端,其它用戶端不會受到任何影響。從圖1 的伺服器架構圖可以看出,一組伺服器包括logingate、loginserver、gamegate、gameserver、dbserver和mserver 等多種伺服器。logingate 和gamegate 就是網關伺服器,一般一組伺服器會配置3 台gamegate,因為穩定性對于網絡遊戲營運來說是至關重要的,而伺服器當機等突發事件是遊戲營運中所面臨的潛在風險,配置多台伺服器可以有效地降低單個伺服器當機帶來的風險。另外,配置多台網關伺服器也是進行負載均衡的有效手段之一。其中,各種伺服器的主要功能和彼此之間的資料互動情況如下。

(1)logingate

logingate 主要負責在玩家登入時維護用戶端與loginserver 之間的網絡連接配接與通訊,對loginserver 和用戶端的通信資料進行加解密、校驗。

(2)loginserver

loginserver 主要功能是驗證玩家的賬号是否合法,隻有通過驗證的賬号才能登入遊戲。從架構圖可以看出,dbserver 和gameserver 會連接配接loginserver。玩家登入基本流程是,用戶端發送賬号和密碼到loginserver 驗證,如果驗證通過,loginserver 會給玩家配置設定一個sessionkey,loginserver 會把這個sessionkey 發送給用戶端、dbserver和gameserver,在後續的選擇角色以後進入遊戲過程中,dbserver 和gameserver 将驗證sessionkey 合法性,如果和用戶端攜帶的sessionkey 不一緻,将無法成功擷取到角色或者進入遊戲。

(3)gamegate

gamegate(gg)主要負責在使用者遊戲過程中負責維持gs與用戶端之間的網絡連接配接和通訊,對gs 和用戶端的通信資料進行加解密和校驗,對用戶端發往gs 的使用者資料進行解析,過濾錯誤包,對用戶端發來的一些協定作簡單的邏輯處理,其中包括遊戲邏輯中的一些逾時判斷。在使用者選擇角色過程中負責維持dbserver 與用戶端之間的網絡連接配接和通訊,對dbserver 和用戶端的通信資料進行加解密和校驗,對用戶端發往dbserver 的使用者資料做簡單的分析。維持用戶端與mserver 之間的網絡連接配接與通訊、加解密、資料轉發和簡單的邏輯處理等。

(4)gameserver

gameserver(gs)主要負責遊戲邏輯處理。在軟體架構層面,本系統将遊戲的衆多系統設計成gs 的子系統或子產品,它們共同處理整個遊戲世界邏輯的運算。遊戲邏輯包括角色進入與退出遊戲、跳gs 以及各種邏輯動作(比如行走、說話和攻擊等)。由于整個遊戲世界有許多遊戲場景,在該架構中一組伺服器有3 台gs 共同負責遊戲邏輯處理,每台遊戲伺服器負

責一部分地圖的處理,這樣不僅降低了單台伺服器的負載,而且降低了gs 當機帶來的風險。玩家角色資訊裡會保持玩家上次退出遊戲時的地圖編号和所在gs 編号,這樣玩家再次登入時,會進入到上次退出時的gs。

上面提到過,在驗證賬号之後,loginserver 會把這個sessionkey 發給gs,當玩家選擇角色登入gs 時,會把sessionkey 一起發給gs,這時gs 會驗證sessionkey 是否與其儲存的相一緻,不一緻的話gs 會拒絕玩家進入遊戲。mserver 的主要負責gs 之間的資料轉發以及資料廣播,另外,一些系統也可以放到mserver 上,這樣也可以減輕gs的運算壓力。

(5)dbserver

dbserver 主要的功能是緩存玩家角色資料,保證角色資料能快速的讀取和儲存。由于角色資料量是比較大的,包括玩家的等級、經驗、生命值、魔法值、裝備、技能、好友、公會等。如果每次gs 擷取角色資料都去讀資料庫,效率必然非常低下,用dbserver 緩存角色資料之後,極大地提高了資料請求的響應速度。loginserver 會在玩家選組時把sessionkey 發給dbserver,當玩家發送擷取角色資訊協定時會帶上這個sessionkey,如果跟dbserver 儲存的sessionkey 不一緻,則dbserver 會認為玩家不是合法使用者,擷取角色協定将會失敗。另外,玩家選取角色正式進入遊戲時,gs 會給dbserver發送攜帶sessionkey 的擷取角色資訊協定,這時dbserver同樣會驗證sessionkey 的合法性。總之,隻有用戶端、dbserver 和gs 所儲存的sessionkey 一緻,才能保證協定收到成功回報。

與dbserver 通訊的伺服器主要有gg,gs 和loginserver,dbserver 與gg 互動的協定主要包括列角色、建立角色、删除角色、恢複角色等,dbserver 與gs 互動的協定包括讀取角色資料、儲存角色資料和跳伺服器等,dbserver 與loginserver 互動的協定主要是使用者登入協定,這時候會給dbserver 發送sessionkey。

(6)mserver

每一個組有一台mserver,主要負責維持3 台gs 之間資料的轉發和資料廣播。另外一些遊戲系統也可能會放到mserver 上處理,比如行會系統。

1.3 伺服器互動的主要流程

下面給出伺服器之間資料通訊的主要流程,這些流程将展現出各種伺服器之間互動和協同工作的方式。

遊戲伺服器設計

圖2 選擇角色資訊流程

圖2 的流程說明了,在選角色過程中,用戶端會把攜帶遊戲賬号和sessionkey 的選角色協定發給gg,gg 做一些簡單處理之後轉發給dbserver,dbserver 要驗證sessionkey的合法性,驗證通過之後,dbserver 會從角色資訊緩沖區裡取出該賬戶的所有角色資訊發給用戶端。這個過程在用戶端的表現是,當選擇好伺服器組之後,用戶端會直接顯示該賬号下的所有角色,之後就可以選擇角色進入遊戲了。

遊戲伺服器設計

圖3 玩家進入遊戲流程

圖3 的流程說明了,在玩家選角色正式進入遊戲時,用戶端會把攜帶遊戲賬号、角色id 和sessionkey 的登入協定發給gg,gg 做一些簡單處理之後轉發給gs。gs 會驗證sessionkey 的合法性,驗證通過之後,gs 會把驗證通過的結果發給用戶端,同時gs 給dbserver 發擷取角色資料的協定,這些角色資料是一個玩家所有的遊戲資料,包括裝備、技能等等。

遊戲伺服器設計

圖4 遊戲邏輯資料轉發流程

圖4 的流程說明了,在玩家遊戲過程,用戶端把邏輯協定(包括走、說話、跑、使用技能等)發給gg,gg 完成加解密和簡單邏輯處理之後轉發給gs,gs 負責這些協定的主要邏輯處理。

繼續閱讀