《游戏服务器的架构演进》阅读笔记
游戲服務器特征
游戲服務器端,是一個會長期運行的程序,并且它還要服務于多個不定時,不定點的網絡請求。所以這類軟件的特點是要非常關注穩定性和性能。這類程序如果需要多個協作來提高承載能力,則還要關注部署和擴容的便利性;同時,還需要考慮如何實現某種程度容災需求。由于多進程協同工作,也帶來了開發的復雜度,這也是需要關注的問題。
功能約束,是架構設計決定性因素?;谟螒蝾I域的功能特征,對服務器端系統來說,有以下幾個特殊的需求:
對于游戲數據和玩家數據的存儲
對玩家數據進行數據廣播和同步
把一部分游戲邏輯在服務器上運算,做好驗證,防止外掛。
針對以上的需求特征,在服務器端,我們往往會關注對電腦內存和CPU的使用,以求在特定業務代碼下,能盡量滿足承載量和響應延遲的需求。最基本的做法就是“空間換時間”,用各種緩存的方式來以求得CPU和內存空間上的平衡。
在CPU和內存之上,是另外一個約束因素:網卡。網絡帶寬直接限制了服務器的處理能力,所以游戲服務器架構也必定要考慮這個因素。
?
游戲服務器架構要素
對于游戲服務端架構,最重要的三個部分就是,如何使用CPU、內存、網卡的設計:
內存架構:主要決定服務器如何使用內存,以最大化利用服務器端內存來提高承載量,降低服務延遲。
邏輯架構:設計如何使用進程、線程、協程這些對于CPU調度的方案。選擇同步、異步等不同的編程模型,以提高服務器的穩定性和承載量。可以分區分服,也可以采用世界服的方式,將相同功能模塊劃分到不同的服務器來處理。
通信模式:決定使用何種方式通訊?;谟螒蝾愋筒煌捎貌煌耐ㄐ拍J?#xff0c;比如http,tcp,udp等。
?
服務器演化進程
之前的網游服務器都是分區分服,玩家都被劃分在不同的服務器上,每臺服務器運行的邏輯相同,玩家不能在不同服務器之間交互。想要更多的玩家在同一世界,保持玩家的活躍度,于是就有了世界服模型了。世界服類型也有以下3種演化:
一類型(三層架構)
網關部分分離成單端的gate服務器,DB部分分離為DB服務器,把網絡功能單獨提取出來,讓用戶統一去連接一個網關服務器,再有網關服務器轉發數據到后端游戲服務器。而游戲服務器之間數據交換也統一連接到網管進行交換。所有有DB交互的,都連接到DB服務器來代理處理。
二類型(cluster)
有了一類型的經驗,后續肯定是拆分的越細,性能越好,就類似現在微服務,每個相同的模塊分布到一臺服務器處理,多組服務器集群共同組成一個游戲服務端。
一般地,我們可以將一個組內的服務器簡單地分成兩類:場景相關的(如:行走、戰斗等)以及場景不相關的(如:公會聊天、不受區域限制的貿易等)。經??梢砸姷降囊环N方案是:gate服務器、場景服務器、非場景服務器、聊天管理器、AI服務器以及數據庫代理服務器。如下模型:
以上中我們簡單的講下服務器的三種類型功能:
場景服務器:它負責完成主要的游戲邏輯,這些邏輯包括:角色在游戲場景中的進入與退出、角色的行走與跑動、角色戰斗(包括打怪)、任務的認領等。場景服務器設計的好壞是整個游戲世界服務器性能差異的主要體現,它的設計難度不僅僅在于通信模型方面,更主要的是整個服務器的體系架構和同步機制的設計。
非場景服務器:它主要負責完成與游戲場景不相關的游戲邏輯,這些邏輯不依靠游戲的地圖系統也能正常進行,比如公會聊天或世界聊天,之所以把它從場景服務器中獨立出來,是為了節省場景服務器的CPU和帶寬資源,讓場景服務器能夠盡可能快地處理那些對游戲流暢性影響較大的游戲邏輯。
網關服務器: 在類型一種的架構中,玩家在多個地圖跳轉或者場景切換的時候采用跳轉的模式,以此進行跳轉不同的服務器。還有一種方式是把這些服務器的節點都通過網關服務器管理,玩家和網關服務器交互,每個場景或者服務器切換的時候,也有網關服務器統一來交換數據,如此玩家操作會比較流暢。
通過這種類型服務器架構,因為壓力分散了,性能會有明顯提升,負載也更大了,包括目前一些大型的 MMORPG游戲就是采用此架構。不過每增加一級服務器,狀態機復雜度可能會翻倍,導致研發和找bug的成本上升,這個對開發組挑戰比較大,沒有經驗,很容出錯。
?
閱讀原文:
https://mp.weixin.qq.com/s?__biz=MzI3MTQ1NzU2NA==&mid=2247483884&idx=1&sn=3547c769a300f1d82cc04e9b1852c6d5&chksm=eac0cd9fddb7448997e38a74e2d26bde259cd2127583e31bc488511bc1fdcd9f35caff27d4a3&scene=21#wechat_redirect
?
轉載于:https://www.cnblogs.com/iCheny/p/11056463.html
總結
以上是生活随笔為你收集整理的《游戏服务器的架构演进》阅读笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 两行代码解析json文件
- 下一篇: 快速查找所有存储过程/触发器中是否包含某