3C科技 娛樂遊戲 美食旅遊 時尚美妝 親子育兒 生活休閒 金融理財 健康運動 寰宇綜合

Zi 字媒體

2017-07-25T20:27:27+00:00
加入好友
遊戲伺服器特徵 遊戲伺服器端,是一個會長期運行的程序,並且它還要服務於多個不定時,不定點的網路請求。所以這類軟體的特點是要非常關注穩定性和性能。這類程序如果需要多個協作來提高承載能力,則還要關注部署和擴容的便利性;同時,還需要考慮如何實現某種程度容災需求。由於多進程協同工作,也帶來了開發的複雜度,這也是需要關注的問題。功能約束,是架構設計決定性因素。基於遊戲領域的功能特徵,對伺服器端系統來說,有以下幾個特殊的需求:對於遊戲數據和玩家數據的存儲對玩家數據進行數據廣播和同步把一部分遊戲邏輯在伺服器上運算,做好驗證,防止外掛。針對以上的需求特徵,在伺服器端,我們往往會關注對電腦內存和 CPU 的使用,以求在特定業務代碼下,能盡量滿足承載量和響應延遲的需求。最基本的做法就是「空間換時間」,用各種緩存的方式來以求得 CPU 和內存空間上的平衡。在 CPU 和內存之上,是另外一個約束因素:網卡。網路帶寬直接限制了伺服器的處理能力,所以遊戲伺服器架構也必定要考慮這個因素。遊戲伺服器架構要素 對於遊戲服務端架構,最重要的三個部分就是,如何使用 CPU、內存、網卡的設計:內存架構:主要決定伺服器如何使用內存,以最大化利用伺服器端內存來提高承載量,降低服務延遲。邏輯架構:設計如何使用進程、線程、協程這些對於 CPU 調度的方案。選擇同步、非同步等不同的編程模型,以提高伺服器的穩定性和承載量。可以分區分服,也可以採用世界服的方式,將相同功能模塊劃分到不同的伺服器來處理。通信模式:決定使用何種方式通訊。基於遊戲類型不同採用不同的通信模式,比如 http,tcp,udp 等。伺服器演化進程 1、卡牌等休閒遊戲弱交互遊戲 伺服器基於遊戲類型不同,所採用的架構也有所不同,我們先講一下簡單的模型,採用 http 通信模式架構的伺服器:這種伺服器架構和我們常用的 web 伺服器架構差不多,也是採用 nginx 負載集群支持伺服器的水平擴展,memcache 做緩存。唯一不同的地點不同的在於通信層需要對協議再加工和加密,一般每個公司都有自己的一套基於 http 的協議層框架,很少採用開源框架。2、長鏈接遊戲伺服器 長連接遊戲和弱聯網遊戲不同的地方在於,長連接中,玩家是有狀態的,伺服器可以時時和 client 交互,數據的傳送,不像弱聯網一般每次都需要重新創建一個連接,消息傳送的頻率以及速度上都快於弱聯網遊戲。1) 第一代網游伺服器(單線程無阻塞)最早的遊戲伺服器是 1978 年,英國著名的財經學校 University of Essex 的學生 Roy Trubshaw 編寫了世界上第一個 MUD 程序,叫做《MUD1》。《MUD1》程序的源代碼在 ARPANET 共享之後,在全世界廣泛流行起來。不斷完善的 MUD1 的基礎上產生了開源的 MudOS(1991),成為眾多網游的鼻祖。MUD1 是一款純文字的世界,沒有任何圖片,但是不同計算機前的玩家可以在遊戲里共同冒險、交流。與以往具有網路聯機功能的遊戲相比, MUD1 是第一款真正意義上的實時多人交互的網路遊戲,它最大的特色是能夠保證整個虛擬世界和玩家角色的持續發展——無論是玩家退出后重新登錄還是伺服器重啟,遊戲中的場景、寶箱、怪物和謎題仍保持不變,玩家的角色也依然是上次的狀態。MUD 中文版MUDOS 使用單線程無阻塞套接字來服務所有玩家,所有玩家的請求都發到同一個線程去處理,主線程每隔 1 秒鐘更新一次所有對象(網路收發,對象狀態,刷新地圖,刷新 NPC)。用戶使用 Telnet 之類的客戶端用 Tcp 協議連接到 MUDOS 上,使用純文字進行遊戲,每條指令用回車進行分割。這樣的系統在當時每台伺服器承載個 4000 人同時遊戲。從 1991 年的 MUDOS 發布后,全球各地都在為他改進,擴充,推出新版本。MUDOS 中遊戲內容通過 LPC 腳本進行定製,邏輯處理採用單線程 tick 輪詢,這也是第一款服務端架構模型,後來被應用到不同遊戲上。後續很多遊戲都是跟《UO》一樣,直接在 MUDOS 上進行二次開發,直到 如今,一些回合制遊戲,以及對運算量小的遊戲,依然採用這種伺服器架構。第一代伺服器架構圖線程模型2) 第二代網游伺服器(分區分服)2000 年左右,隨著圖形界面的出現,遊戲更多的採用圖形界面與用戶交互。此時隨著在線人數的增加和遊戲數據的增加,伺服器變得不抗重負。於是就有了分服模型。分服模型結構如下:分服模型是遊戲伺服器中最典型,也是歷久最悠久的模型。在早期伺服器的承載量達到上限的時候,遊戲開發者就通過架設更多的伺服器來解決。這樣提供了很多個遊戲的「平行世界」,讓遊戲中的人人之間的比較,產生了更多的空間。其特徵是遊戲伺服器是一個個單獨的世界。每個伺服器的帳號是獨立的,每台伺服器用戶的狀態都是不一樣的,一個服就是一個世界,大家各部牽扯。後來遊戲玩家呼籲要跨服打架,於是出現了跨服戰,再加上隨著遊戲的運行,單個伺服器的遊戲活躍玩家越來越少,所以後期就有了伺服器的合併以及遷移,慢慢的以伺服器的開放、合併形成了一套成熟的運營手段。目前多數遊戲還採用分服的結構來架設伺服器,多數頁游還是採用這種模式。線程調度分服雖然可以解決伺服器擴展的瓶頸,但單台伺服器在以前單線程的方式來運行,沒辦法充分利用伺服器資源,於是又演變出了以下 兩種線程模型。非同步 - 多線程:基於每個場景(或者房間),分配一個線程。每個場景的玩家同屬於一個線程。遊戲的場景是固定的,不會很多,如此線程的數量可以保證不會不斷增大。每個場景線程,同樣採用 tick 輪詢的方式,來定時更新該場景內的(對象狀態,刷新地圖,刷新 NPC)數據狀態。玩家如果跨場景的話,就採用投遞和通知的方式,告知兩個場景線程,以此更新兩個場景的玩家數據。多進程:由於單進程架構下,總會存在承載量的極限,越是複雜的遊戲,其單進程承載量就越低,因此一定要突破進程的限制,才能支撐更複雜的遊戲。多進程系統的其他一些好處:能夠利用上多核 CPU 能力、更容易進行容災處理。多進程系統比較經典的模型是「三層架構」,比如,基於之前的場景線程再做改進,把網路部分和資料庫部分分離為單獨的進程來處理,邏輯進程專心處理邏輯任務,不合 IO 打交道,網路 IO 和磁碟 IO 分別交由網路進程和 DB 進程處理。3) 第三代網游伺服器之前的網游伺服器都是分區分服,玩家都被劃分在不同的伺服器上,每台伺服器運行的邏輯相同,玩家不能在不同伺服器之間交互。想要更多的玩家在同一世界,保持玩家的活躍度,於是就有了世界服模型了。世界服類型也有以下 3 種演化:一類型(三層架構)網關部分分離成單端的 gate 伺服器,DB 部分分離為 DB 伺服器,把網路功能單獨提取出來,讓用戶統一去連接一個網關伺服器,再有網關伺服器轉發數據到後端遊戲伺服器。而遊戲伺服器之間數據交換也統一連接到網管進行交換。所有有 DB 交互的,都連接到 DB 伺服器來代理處理。二類型(cluster)有了一類型的經驗,後續肯定是拆分的越細,性能越好,就類似現在微服務,每個相同的模塊分佈到一台伺服器處理,多組伺服器集群共同組成一個遊戲服務端。一般地,我們可以將一個組內的伺服器簡單地分成兩類:場景相關的(如:行走、戰鬥等)以及場景不相關的(如:公會聊天、不受區域限制的貿易等)。經常可以見到的一種方案是:gate 伺服器、場景伺服器、非場景伺服器、聊天管理器、AI 伺服器以及資料庫代理伺服器。如下模型:以上中我們簡單的講下伺服器的三種類型功能:場景伺服器:它負責完成主要的遊戲邏輯,這些邏輯包括:角色在遊戲場景中的進入與退出、角色的行走與跑動、角色戰鬥(包括打怪)、任務的認領等。場景伺服器設計的好壞是整個遊戲世界伺服器性能差異的主要體現,它的設計難度不僅僅在於通信模型方面,更主要的是整個伺服器的體系架構和同步機制的設計。非場景伺服器:它主要負責完成與遊戲場景不相關的遊戲邏輯,這些邏輯不依靠遊戲的地圖系統也能正常進行,比如公會聊天或世界聊天,之所以把它從場景伺服器中獨立出來,是為了節省場景伺服器的 CPU 和帶寬資源,讓場景伺服器能夠儘可能快地處理那些對遊戲流暢性影響較大的遊戲邏輯。網關伺服器: 在類型一種的架構中,玩家在多個地圖跳轉或者場景切換的時候採用跳轉的模式,以此進行跳轉不同的伺服器。還有一種方式是把這些伺服器的節點都通過網關伺服器管理,玩家和網關伺服器交互,每個場景或者伺服器切換的時候,也有網關伺服器統一來交換數據,如此玩家操作會比較流暢。通過這種類型伺服器架構,因為壓力分散了,性能會有明顯提升,負載也更大了,包括目前一些大型的 MMORPG 遊戲就是採用此架構。不過每增加一級伺服器,狀態機複雜度可能會翻倍,導致研發和找 bug 的成本上升,這個對開發組挑戰比較大,沒有經驗,很容出錯。三類型(無縫地圖)魔獸世界的中無縫地圖,想必大家印象深刻, 整個世界的移動沒有像以往的遊戲一樣,在切換場景的時候需要 loading 等待,而是直接行走過去,體驗流暢。現在的遊戲大地圖採用無縫地圖多數採用的是 9 宮格的樣式來處理,由於地圖沒有魔獸世紀那麼大,所以採用單台伺服器多進程處理即可,不過類似魔獸世界這種大世界地圖,必須考慮 2 個問題:1、多個地圖節點如何無縫拼接,特別是當地圖節點比較多的時候,如何保證無縫拼接2、如何支持動態分佈,有些區域人多,有些區域人少,保證伺服器資源利用的最大化為了解決這個問題,比較以往按照地圖來切割遊戲而言,無縫世界並不存在一塊地圖上面的人有且只由一台伺服器處理了,此時需要一組伺服器來處理,每台 Node 伺服器用來管理一塊地圖區域,由 NodeMaster(NM)來為他們提供總體管理。更高層次的 World 則提供大陸級別的管理服務。一個 Node 所負責的區域,地理上沒必要連接在一起,可以統一交給一個 Node 去管理,而這些區塊在地理上並沒有聯繫在一起的必要性。一個 Node 到底管理哪些區塊,可以根據遊戲實時運行的負載情況,定時維護的時候進行更改 NodeMaster 上面的配置。對象的無縫遷移玩家 A、B、C 分別代表 3 種不同的狀態,以及不同的遷移方式,我們分別來看。玩家 A: 玩家 A 在 node1 地圖伺服器上,由 node1 控制,如果遷移到 node2 上,需要將其數據複製到 node2 上,然後從 node1 移除。玩家 B:玩家 B 在 node1 和 node2 中間,此時由 node1 和 node2 維護,若是從 node1 行走到 node2 的過程中,會向 1 請求,同時向 2 請求,待全部移動過去了再移除。玩家 C:玩家 C 在 node2 地圖伺服器上,由 node2 控制,如果遷移到 node1 上,需要將其數據複製到 node1 上,然後從 node2 移除。具體魔獸世界伺服器的分析,篇幅過多,我們以後再聊。3、房間伺服器(遊戲大廳) 房間類玩法和 MMORPG 有很大的不同,在於其在線廣播單元的不確定性和廣播數量很小。而且需要匹配一台房間伺服器讓少數人進入一個伺服器。這一類遊戲最重要的是其「遊戲大廳」的承載量,每個「遊戲房間」受邏輯所限,需要維持和廣播的玩家數據是有限的,但是「遊戲大廳」需要維持相當高的在線用戶數,所以一般來說,這種遊戲還是需要做「分服」的。典型的遊戲就是《英雄聯盟》這一類遊戲了。而「遊戲大廳」裡面最有挑戰性的任務,就是「自動匹配」玩家進入一個「遊戲房間」,這需要對所有在線玩家做搜索和過濾。玩家先登錄「大廳伺服器」,然後選擇組隊遊戲的功能,伺服器會通知參與的所有遊戲客戶端,新開一條連接到房間伺服器上,這樣所有參與的用戶就能在房間伺服器里進行遊戲交互了。以上就是目前遊戲伺服器的演化進程,由於所涉及的內容太多,關於伺服器的相關網路 IO 以及內存模型都沒有介紹,以後有機會再具體講講這一部分。作者介紹wier,樂元素leader軟體工程師。從2010年起從事遊戲開發,經歷過頁游和手游兩個遊戲發展期,期間曾帶領團隊開發過山寨機上第一款偷菜遊戲,如今專註於二次元遊戲領域及伺服器技術研究,運維了一個遊戲公眾號,期待用自己的一點努力和貢獻,推進遊戲社區的前進。個人微信號ID:wierWu(添加時請註明『InfoQ』) ;(cool_wier)對遊戲運維感興趣嗎?那你不如考慮下 9 月的運維大會,這裡有 InfoQ 為您製作的《遊戲開發與運維》專題哦~ 已經確認的一個議題是《網易遊戲運維與容器雲的碰撞與融合實踐》2017 年,有哪些值得關注的運維技術熱點?智能化運維、Serverless、DevOps ......12 位大牛聯合出品,揭秘最前沿運維技術,推薦學習!點擊閱讀原文,移步了解詳情

本文由yidianzixun提供 原文連結

寫了 5860316篇文章,獲得 23313次喜歡
精彩推薦