最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

深入淺出分布式服務(wù)器架構(gòu)

2022-08-24 18:17 作者:獨(dú)立游戲人-老雷  | 我要投稿

前言

本文是對(duì)分布式服務(wù)器架構(gòu)的由來(lái)進(jìn)行介紹,要開發(fā)一款網(wǎng)絡(luò)游戲自然不能對(duì)開發(fā)網(wǎng)絡(luò)游戲的歷史一無(wú)所知,充分了解網(wǎng)絡(luò)游戲開發(fā)的歷史也能加深對(duì)當(dāng)前網(wǎng)絡(luò)游戲架構(gòu)的理解

下面就來(lái)看一看網(wǎng)絡(luò)游戲的服務(wù)器是如何一步步的從一個(gè)簡(jiǎn)單的服務(wù)器逐漸過(guò)渡到當(dāng)前熱門的分布式架構(gòu)服務(wù)器的

版權(quán)聲明

  • 本文為“優(yōu)夢(mèng)創(chuàng)客”原創(chuàng)文章,您可以自由轉(zhuǎn)載,但必須加入完整的版權(quán)聲明

  • 更多學(xué)習(xí)資源請(qǐng)加QQ:1517069595或WX:alice17173獲取(企業(yè)級(jí)性能優(yōu)化/熱更新/Shader特效/服務(wù)器/商業(yè)項(xiàng)目實(shí)戰(zhàn)/每周直播/一對(duì)一指導(dǎo))

  • 點(diǎn)贊、關(guān)注、分享可免費(fèi)獲得配套學(xué)習(xí)資源

  • 詳細(xì)內(nèi)容可觀看文末完整視頻

卡牌、跑酷等弱交互服務(wù)器

  • 最簡(jiǎn)單的網(wǎng)絡(luò)游戲就是弱鏈接網(wǎng)絡(luò)游戲,類似于天天酷跑和單機(jī)卡牌這樣的只需要在每局游戲完成以后把數(shù)據(jù)上傳到服務(wù)器的游戲就可以被稱為弱鏈接網(wǎng)絡(luò)游戲

  • 這種游戲往往會(huì)使用更簡(jiǎn)單的弱鏈接游戲服務(wù)器,也就是HTTP服務(wù)器,因?yàn)檫@種游戲的交互比較弱,玩家與玩家之間不需要實(shí)時(shí)面對(duì)面PK,所以根本不需要專用的游戲服務(wù)器

  • 這種游戲在登陸時(shí)會(huì)采用非對(duì)稱加密方式來(lái)對(duì)玩家的密碼進(jìn)行加密,服務(wù)器會(huì)根據(jù)客戶端的用戶ID號(hào)、當(dāng)前時(shí)間戳、以及服務(wù)器端的私鑰計(jì)算出一個(gè)哈希值,以得到加密后的密鑰,然后把密鑰發(fā)送給客戶端之后,雙方就可以用通過(guò)加密的密鑰來(lái)進(jìn)行通信,這是最簡(jiǎn)單、最早期的服務(wù)器采用的加密方式,這種加密方式的特點(diǎn)就是安全性高,但速度慢

第一代游戲服務(wù)器

  • 世界上第一個(gè)網(wǎng)絡(luò)游戲:MUD1

    • 世界上的第一個(gè)網(wǎng)絡(luò)游戲叫做MUD1,它是文字類的網(wǎng)絡(luò)游戲,類似于現(xiàn)在玩的文字冒險(xiǎn)游戲

    • MUD1是由1978年英國(guó)某著名財(cái)經(jīng)學(xué)校的學(xué)生編寫的,并在1980年時(shí)將MUD1接入到了一個(gè)類似于現(xiàn)在的internet的網(wǎng)絡(luò)里

  • 網(wǎng)絡(luò)游戲的鼻祖:MudOS

    • 由于MUD1的游戲源代碼是共享的,所以在之后出現(xiàn)了許多改編版本,MUD1也在全世界廣泛流行起來(lái),并以MUD1為基礎(chǔ)產(chǎn)生了一個(gè)開源游戲框架:MudOS,它是眾多網(wǎng)絡(luò)游戲的鼻祖

    • 因?yàn)橥婕遗c玩家之間有比較強(qiáng)的交互,所以MudOS使用了一種單線程的無(wú)阻塞套接字來(lái)服務(wù)所有玩家,單線程的好處就是不容易出現(xiàn)多線程的死鎖、數(shù)據(jù)不同步問(wèn)題,但是單線程的效率要低一些

    • 并且由于MudOS是采用無(wú)阻塞套接字,所以它的網(wǎng)絡(luò)數(shù)據(jù)收發(fā)比較流暢,可以服務(wù)多個(gè)玩家,如果使用阻塞套接字就只能一次服務(wù)一個(gè)玩家

    • MudOS里的所有玩家請(qǐng)求都是發(fā)送到同一個(gè)線程中處理的,主線程每隔一秒鐘就會(huì)對(duì)玩家對(duì)象進(jìn)行一次更新,更新內(nèi)容包括網(wǎng)絡(luò)的數(shù)據(jù)收發(fā)更新、對(duì)象的狀態(tài)機(jī)、處理超時(shí)、刷新地圖、刷新NPC等等,這里就已經(jīng)看出MudOS已經(jīng)有了類似于當(dāng)前網(wǎng)絡(luò)游戲的感覺(jué)了

  • MudOS的特點(diǎn)

    • 最早的游戲是采用房間的形式來(lái)對(duì)游戲世界進(jìn)行管理的,每個(gè)房間都有東、南、西、北四個(gè)方向,可以進(jìn)行移動(dòng),移動(dòng)時(shí)會(huì)進(jìn)入下一個(gè)房間,由于歐美游戲最早的網(wǎng)游都是采用迷宮的形式,所以場(chǎng)景里最基本的移動(dòng)單位被稱為房間

    • MudOS使用了一門獨(dú)創(chuàng)的編程語(yǔ)言,叫做LPC

      • MudOS用LPC腳本語(yǔ)言來(lái)描述游戲世界、游戲中房間和房間之間的聯(lián)系、NPC、還有各種各樣的劇情,游戲里的高級(jí)玩家可以不斷的通過(guò)修改腳本,來(lái)為這個(gè)游戲添加房間、增加劇情

      • 早期的MUD1上線時(shí)只有17個(gè)房間,開發(fā)MUD1游戲的這位同學(xué)畢業(yè)后把項(xiàng)目交給了他的師弟,他的師弟在之后為游戲添加了各種各樣的新玩法和100多個(gè)房間,最終使MUD游戲發(fā)揚(yáng)光大

    • MudOS的游戲用戶是使用類似于Telnet的網(wǎng)絡(luò)客戶端,通過(guò)TCP協(xié)議鏈接到MudOS,然后使用純文字來(lái)進(jìn)行游戲,每一條指令都使用回車鍵進(jìn)行分割,也就是當(dāng)你輸入完一個(gè)指令,按下了回車,那么這個(gè)指令就會(huì)發(fā)送到服務(wù)器上,并做相應(yīng)的處理,這跟現(xiàn)在的網(wǎng)絡(luò)游戲沒(méi)有太大的差別

    • 在那個(gè)年代游戲的數(shù)據(jù)是直接保存在服務(wù)器的文件里,這是一種非常簡(jiǎn)陋的方式,因?yàn)樵L問(wèn)文件的效率沒(méi)有訪問(wèn)數(shù)據(jù)庫(kù)快,并且當(dāng)時(shí)的游戲服務(wù)器能夠承載的人數(shù)是4000人左右,游戲內(nèi)容通過(guò)LPC腳本進(jìn)行定制

  • MudOS為國(guó)內(nèi)的第一代MMORPG游戲提供了穩(wěn)固的支持,一直持續(xù)到2003年,后面對(duì)基于MudOS的游戲增加了很多圖形化的東西,但這些非圖形化的內(nèi)容一直都是MMORPG后端的本質(zhì)

第二代游戲服務(wù)器

  • 在2000年以后,網(wǎng)絡(luò)游戲脫離了最初的文字形式,進(jìn)入全面的圖形化階段,在這個(gè)過(guò)程中最先承受不住就是服務(wù)器,最先出現(xiàn)性能瓶頸的地方是文件訪問(wèn),第一代的MudOS服務(wù)器里的數(shù)據(jù)都是以文字形式進(jìn)行保存的,隨著用戶逐漸增多,如果要為每一個(gè)用戶建立一個(gè)數(shù)據(jù)文件,那么就會(huì)有很多的用戶文件

  • 用戶頻繁的上下線會(huì)使服務(wù)器也頻繁的對(duì)用戶數(shù)據(jù)進(jìn)行讀寫,從而導(dǎo)致服務(wù)器的負(fù)載越來(lái)越大,難以承受,而且最早期的磁盤分區(qū)采用的格式是EXT格式,比較脆弱,只要稍微一斷電就可能發(fā)生玩家數(shù)據(jù)文件損壞的問(wèn)題,很容易造成數(shù)據(jù)丟失

  • 要解決這些問(wèn)題就需要拆分文件里的數(shù)據(jù),把它放到數(shù)據(jù)庫(kù)里,如果每個(gè)玩家都要有一個(gè)文件,那么由于文件的碎片存在,磁盤對(duì)這些數(shù)據(jù)文件進(jìn)行訪問(wèn)的效率會(huì)非常低,所以需要引入到數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)經(jīng)過(guò)了很多數(shù)據(jù)訪問(wèn)的優(yōu)化,所以不會(huì)產(chǎn)生這種碎片文件

  • 上圖是第二代服務(wù)器的第二種形態(tài),隨著游戲服務(wù)器的演化發(fā)展,游戲服務(wù)器已經(jīng)脫離了陳舊的基于MudOS的體系,各個(gè)游戲公司在參考了MudOS組織結(jié)構(gòu)的情況下,開始自己用C語(yǔ)言重新開發(fā)游戲服務(wù)器,并且游戲腳本也已經(jīng)拋棄了傳統(tǒng)的LPC腳本,開始采用擴(kuò)展性更好、性能更好的Python或者Lua來(lái)替代

  • LPC腳本的主邏輯使用的是單線程,隨著游戲內(nèi)容的增加,傳統(tǒng)的單線程單服務(wù)器逐漸成為了瓶頸,所以就有人將游戲服務(wù)器拆開,使用多個(gè)服務(wù)器來(lái)提升游戲性能

  • 上圖是第一代服務(wù)器的第三種形態(tài),游戲服務(wù)器經(jīng)過(guò)第二種形態(tài)的改進(jìn)后,邏輯處理效率已經(jīng)提高、邏輯處理的壓力也被緩解了,但兩臺(tái)游戲服務(wù)器同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)造成的大量重復(fù)數(shù)據(jù)訪問(wèn)、數(shù)據(jù)交換,使數(shù)據(jù)庫(kù)訪問(wèn)又成了一個(gè)瓶頸

  • 為了解決這個(gè)問(wèn)題開發(fā)者為數(shù)據(jù)庫(kù)訪問(wèn)再增加了一層代理層

    • 數(shù)據(jù)庫(kù)代理層的作用是不讓游戲服務(wù)器直接訪問(wèn)數(shù)據(jù)庫(kù),要訪問(wèn)數(shù)據(jù)庫(kù)就必須先訪問(wèn)游戲代理

    • 比如服務(wù)器要從數(shù)據(jù)庫(kù)里拿出數(shù)據(jù),取出的數(shù)據(jù)會(huì)被放到代理層的服務(wù)器上,這時(shí)代理層的服務(wù)器里就包含了早先訪問(wèn)數(shù)據(jù)庫(kù)時(shí)拿到的數(shù)據(jù)

    • 當(dāng)有其他玩家又要訪問(wèn)數(shù)據(jù)庫(kù)獲取相同的數(shù)據(jù)時(shí),代理層就可以直接把緩存的數(shù)據(jù)返回給第二個(gè)玩家,這就是數(shù)據(jù)庫(kù)的前端代理

  • 游戲服務(wù)器不再直接訪問(wèn)數(shù)據(jù)庫(kù),而是訪問(wèn)游戲的代理,然后再由代理去訪問(wèn)數(shù)據(jù)庫(kù),同時(shí)在內(nèi)存中提供內(nèi)存級(jí)別的緩存,在MySQL4之前它沒(méi)有提供存儲(chǔ)過(guò)程,所以前端代理一般是跟MySQL服務(wù)器跑在同一臺(tái)機(jī)器上面的,它會(huì)把服務(wù)器發(fā)過(guò)來(lái)的數(shù)據(jù)訪問(wèn)指令進(jìn)行轉(zhuǎn)換,拆分成具體的數(shù)據(jù)庫(kù)操作,在一定過(guò)程上替代了存儲(chǔ)過(guò)程

  • 第三型的游戲服務(wù)器結(jié)構(gòu)并沒(méi)有持續(xù)太長(zhǎng)時(shí)間,因?yàn)橛螒蛲婕以谇袚Q場(chǎng)景時(shí)經(jīng)常要切換連接,導(dǎo)致中間狀態(tài)容易混亂

    • 比如玩家在第一次登陸游戲時(shí)進(jìn)入了服務(wù)器A,第二次又進(jìn)到了服務(wù)器B,這時(shí)由于游戲的服務(wù)器太多,服務(wù)器在管理時(shí)就容易出現(xiàn)混亂

  • 數(shù)據(jù)之間的交互也很麻煩,所以要繼續(xù)對(duì)服務(wù)器進(jìn)行拆分,第四型服務(wù)器拆分出了一個(gè)網(wǎng)關(guān)服務(wù)器,網(wǎng)關(guān)服務(wù)器就像網(wǎng)絡(luò)設(shè)備里的硬件網(wǎng)關(guān)一樣,它是提供給外部所有的玩家訪問(wèn)游戲服務(wù)器的關(guān)口

  • 網(wǎng)關(guān)服務(wù)器把玩家訪問(wèn)服務(wù)器的功能全部提取出來(lái),讓玩家統(tǒng)一連接網(wǎng)關(guān)服務(wù)器,然后再由網(wǎng)關(guān)服務(wù)器把功能數(shù)據(jù)轉(zhuǎn)發(fā)到后端的游戲服務(wù)器,而服務(wù)器與服務(wù)器之間的數(shù)據(jù)交換也是統(tǒng)一經(jīng)過(guò)網(wǎng)關(guān)來(lái)進(jìn)行交換

  • 舉個(gè)例子:如果游戲世界A要與游戲世界B進(jìn)行數(shù)據(jù)交換,那么我們能不能直接交換呢?

    • 在第二代的第四型服務(wù)器里是不可以進(jìn)行直接交換的,需要先把游戲世界A的數(shù)據(jù)通過(guò)網(wǎng)關(guān)轉(zhuǎn)發(fā)到游戲世界B,然后由游戲世界B把數(shù)據(jù)讀出來(lái)后,再通過(guò)網(wǎng)關(guān)把它轉(zhuǎn)發(fā)給游戲世界A

    • 看上去數(shù)據(jù)的交換復(fù)雜了一點(diǎn),但它保證了架構(gòu)的穩(wěn)定性,因?yàn)檐浖O(shè)計(jì)有一個(gè)很重要的原則:高內(nèi)聚低耦合

  • 這種類型的服務(wù)器能夠穩(wěn)定的為玩家提供游戲服務(wù),一臺(tái)網(wǎng)關(guān)服務(wù)器能夠支持一到兩萬(wàn)人

  • 隨著年代的發(fā)展,網(wǎng)絡(luò)游戲玩家越來(lái)越多,玩法也越來(lái)越多,傳統(tǒng)的服務(wù)器性能又不能夠滿足需求了,這時(shí)就需要采用服務(wù)器擴(kuò)展的方式來(lái)滿足服務(wù)器的性能需求了

    • 按照前人的經(jīng)驗(yàn),把MudOS的各個(gè)服務(wù)拆開會(huì)使它的性能更好,所以既然網(wǎng)關(guān)服務(wù)器可以拆分出來(lái),那么基礎(chǔ)服務(wù)也可以進(jìn)行拆分,比如將基礎(chǔ)服務(wù)中的聊天、交易服務(wù)拆分到聊天服務(wù)器和交易服務(wù)器上,讓一臺(tái)服務(wù)器只負(fù)責(zé)某一項(xiàng)特定的功能

    • 同時(shí)也增加一些關(guān)鍵服務(wù)器的數(shù)量,比如上圖中的邏輯服務(wù)器(GAME World)和網(wǎng)關(guān)服務(wù)器(GATE)

  • 這樣的服務(wù)器有什么好處呢?

    • 這樣的模型是一個(gè)比較成功的模型,很多成功的游戲都運(yùn)用了類似的架構(gòu),并且發(fā)揮了它的性能優(yōu)勢(shì),但這樣的服務(wù)器又有兩個(gè)挑戰(zhàn),就是每增加一級(jí)服務(wù)器,狀態(tài)機(jī)的復(fù)雜度可能就會(huì)翻倍,比如每一級(jí)有十種狀態(tài),再增加一級(jí),就是十乘以十,也就是有100種狀態(tài)

    • 狀態(tài)機(jī)復(fù)雜度翻倍會(huì)導(dǎo)致研發(fā)和找bug的成本無(wú)限上升,并且對(duì)于開發(fā)組的挑戰(zhàn)也比較大,一旦項(xiàng)目時(shí)間比較緊張,開發(fā)人手不足時(shí),服務(wù)器很可能會(huì)出現(xiàn)停機(jī)的情況

第三代游戲服務(wù)器

  • 第三代的游戲服務(wù)器的普及是從2007年開始的,也可以說(shuō)是從《魔獸世界》開始,那時(shí)無(wú)縫的游戲世界地圖已經(jīng)深入人心了,在之前的游戲里玩家走幾步就要切換場(chǎng)景,每次切換場(chǎng)景都要加載幾十秒,這是非常破壞游戲體驗(yàn)的,所以從2005年以后的大型的MMO開始,無(wú)縫地圖就成為了標(biāo)配

  • 以前玩的《暗黑破壞神》是在你進(jìn)入到某一層時(shí)加載一個(gè)地圖,到了第三代游戲服務(wù)器后就不是這樣了,第三代游戲服務(wù)器的架構(gòu)如上方圖片所示,也是有兩個(gè)網(wǎng)關(guān)服務(wù)器,玩家是連接網(wǎng)關(guān)服務(wù)器的,不是直接連接后端服務(wù)器

  • 由于第三代服務(wù)器沒(méi)有地圖的存在,不能像第二代服務(wù)器一樣有游戲世界A或者游戲世界B,所以出現(xiàn)了節(jié)點(diǎn)服務(wù)器,一個(gè)節(jié)點(diǎn)服務(wù)器可以認(rèn)為是游戲里的一塊區(qū)域,如果游戲里的無(wú)縫地圖分成10塊或者是20塊,那么就會(huì)有20或者10個(gè)節(jié)點(diǎn)服務(wù)器,在節(jié)點(diǎn)服務(wù)器中要進(jìn)行尋路時(shí)只要訪問(wèn)地圖服務(wù)器就可以了,游戲服務(wù)器只是提供了地圖尋路的服務(wù)

  • 無(wú)縫地圖服務(wù)器中最關(guān)鍵的點(diǎn)就是地圖的節(jié)點(diǎn)管理,一個(gè)節(jié)點(diǎn)就是一塊區(qū)域,當(dāng)玩家從節(jié)點(diǎn)A移動(dòng)到節(jié)點(diǎn)B時(shí)發(fā)生了什么樣的事情呢?

    • 玩家在上圖中使用綠色的三角形表示,當(dāng)玩家從節(jié)點(diǎn)A走到節(jié)點(diǎn)B需要做如下處理

      • 玩家1是完全由節(jié)點(diǎn)A控制的,玩家3是由節(jié)點(diǎn)B控制的,處于兩個(gè)節(jié)點(diǎn)邊緣的玩家2同時(shí)由節(jié)點(diǎn)A和節(jié)點(diǎn)B來(lái)進(jìn)行管理,因?yàn)橥婕以诘貓D邊界時(shí)可能會(huì)來(lái)回走動(dòng),直接將他交給節(jié)點(diǎn)A或節(jié)點(diǎn)B進(jìn)行管理都不太合適,所以就交給節(jié)點(diǎn)A和節(jié)點(diǎn)B共同管理

      • 這塊被節(jié)點(diǎn)A與節(jié)點(diǎn)B共同管理的區(qū)域叫做共管區(qū),玩家2從節(jié)點(diǎn)A移到節(jié)點(diǎn)B的過(guò)程中,會(huì)同時(shí)向節(jié)點(diǎn)A和節(jié)點(diǎn)B發(fā)送請(qǐng)求來(lái)獲取節(jié)點(diǎn)A和節(jié)點(diǎn)B的情況,玩家2到達(dá)節(jié)點(diǎn)A的地圖邊界時(shí)就會(huì)開始請(qǐng)求節(jié)點(diǎn)B的一些數(shù)據(jù)了,防止在跨域節(jié)點(diǎn)時(shí)出現(xiàn)卡頓

      • 直到玩家2徹底離開節(jié)點(diǎn)A與節(jié)點(diǎn)B的共管區(qū),玩家2才會(huì)徹底離開節(jié)點(diǎn)A,來(lái)到節(jié)點(diǎn)B,這個(gè)過(guò)程中一般會(huì)使用鏈表或者動(dòng)態(tài)數(shù)組來(lái)進(jìn)行管理

  • 把游戲世界的地圖分割為一個(gè)個(gè)的區(qū)塊交由不同節(jié)點(diǎn)來(lái)管理,但這些節(jié)點(diǎn)在地理上是沒(méi)有必要互相鏈接的,比如在平坦的大陸周圍有一些高山,高山附近的玩家比較少,那么就可以把這些高山區(qū)塊統(tǒng)一交給一個(gè)節(jié)點(diǎn)來(lái)管理,節(jié)點(diǎn)只是邏輯上的概念,所以這個(gè)管理所有的高山區(qū)的節(jié)點(diǎn)沒(méi)有必要跟平坦大陸的節(jié)點(diǎn)連在一起

  • 節(jié)點(diǎn)所管理的區(qū)塊可以在游戲運(yùn)行時(shí)根據(jù)游戲的負(fù)載實(shí)時(shí)調(diào)整,負(fù)責(zé)進(jìn)行調(diào)整就是節(jié)點(diǎn)管理服務(wù)器(NodeMaster),它是非常重要的一個(gè)服務(wù)器

  • 節(jié)點(diǎn)管理服務(wù)器負(fù)責(zé)管理節(jié)點(diǎn)的負(fù)載均衡,在開發(fā)節(jié)點(diǎn)服務(wù)器時(shí),我們碰到的第一個(gè)問(wèn)題就是節(jié)點(diǎn)服務(wù)器需要和玩家進(jìn)行通信

    • 以前使用按照?qǐng)鼍扒懈罘?wù)器的方式問(wèn)題不大,只需要訪問(wèn)一下網(wǎng)關(guān)服務(wù)器就可以把數(shù)據(jù)緩存起來(lái),但現(xiàn)在服務(wù)器種類增加了,玩家又不停的在節(jié)點(diǎn)之間來(lái)回移動(dòng),如果按照用戶編號(hào)來(lái)進(jìn)行查詢就比較麻煩

    • 另外一方面,網(wǎng)關(guān)服務(wù)器要根據(jù)坐標(biāo)來(lái)計(jì)算玩家在哪個(gè)節(jié)點(diǎn)上,玩家來(lái)回移動(dòng)也會(huì)導(dǎo)致邏輯越來(lái)越麻煩

  • 為了解決這個(gè)問(wèn)題,第三代服務(wù)器特地增加了一個(gè)對(duì)象服務(wù)器,原來(lái)的方式是網(wǎng)關(guān)服務(wù)器根據(jù)一定的算法計(jì)算玩家應(yīng)該在哪個(gè)節(jié)點(diǎn)上,由于玩家可能會(huì)從節(jié)點(diǎn)A跑到節(jié)點(diǎn)B去,所以就需要在節(jié)點(diǎn)B上面重新加載玩家放在節(jié)點(diǎn)A上面的數(shù)據(jù),再把它挪到節(jié)點(diǎn)B上面

  • 并且如果一個(gè)玩家與另外一個(gè)節(jié)點(diǎn)的玩家進(jìn)行交互,那么中間的過(guò)程就會(huì)非常復(fù)雜

    • 首先必須要通過(guò)網(wǎng)關(guān)查找來(lái)與節(jié)點(diǎn)B的玩家進(jìn)行交互,節(jié)點(diǎn)B的數(shù)據(jù)又要通過(guò)網(wǎng)關(guān)再轉(zhuǎn)發(fā)給節(jié)點(diǎn)A,過(guò)程非常繁瑣

  • 所以第三代服務(wù)器特地增加了一個(gè)對(duì)象管理服務(wù)器,對(duì)象管理服務(wù)器專門管理一個(gè)節(jié)點(diǎn)上的所有對(duì)象,一個(gè)對(duì)象可以是在節(jié)點(diǎn)A,也可以在節(jié)點(diǎn)B,還可以在節(jié)點(diǎn)C,這樣就變成了節(jié)點(diǎn)只管理一個(gè)區(qū)塊,對(duì)象的數(shù)據(jù)放在對(duì)象服務(wù)器,區(qū)塊的數(shù)據(jù)放在節(jié)點(diǎn)服務(wù)器

  • 上圖是第三代服務(wù)器的第二種形態(tài),網(wǎng)關(guān)服務(wù)器經(jīng)過(guò)精簡(jiǎn)后就沒(méi)有那么多復(fù)雜的功能了,只是負(fù)責(zé)數(shù)據(jù)轉(zhuǎn)發(fā),用戶邏輯放在對(duì)象服務(wù)器里進(jìn)行管理,服務(wù)器經(jīng)過(guò)網(wǎng)關(guān)找對(duì)象時(shí)通過(guò)一個(gè)很簡(jiǎn)單的算法就能知道對(duì)象應(yīng)該在哪個(gè)對(duì)象服務(wù)器上,因?yàn)樗械膶?duì)象都是被一個(gè)對(duì)象管理器管理的

動(dòng)態(tài)負(fù)載均衡

  • 第三代的服務(wù)器上有的節(jié)點(diǎn)被玩家訪問(wèn)的次數(shù)比較多,比如如果一個(gè)游戲服務(wù)器里的交易NPC全部都集中在一塊區(qū)域里,玩家會(huì)經(jīng)常訪問(wèn)這塊區(qū)域,那么這塊區(qū)域的負(fù)載就會(huì)比較大

  • 要解決這個(gè)問(wèn)題可以將人群比較擁擠的區(qū)塊分割的小一點(diǎn),讓一個(gè)節(jié)點(diǎn)管理一個(gè)小區(qū)塊,這個(gè)區(qū)塊里面要管理的NPC和玩家比較多,同樣的也可以將平時(shí)沒(méi)有什么玩家走動(dòng)的打怪地圖劃分的大一些,這就叫做動(dòng)態(tài)負(fù)載均衡

  • 動(dòng)態(tài)負(fù)載均衡是由節(jié)點(diǎn)管理服務(wù)器負(fù)責(zé)管理的

戰(zhàn)網(wǎng)游戲服務(wù)器

  • 戰(zhàn)網(wǎng)服務(wù)器也可以叫做第三代第三型服務(wù)器,傳統(tǒng)的服務(wù)器都是基于最早的MudOS架構(gòu)不斷進(jìn)行延伸,這種架構(gòu)對(duì)于一些實(shí)時(shí)性的戰(zhàn)斗交互處理效率太低了,所以它需要一種戰(zhàn)網(wǎng)服務(wù)器

  • 戰(zhàn)網(wǎng)服務(wù)器的特點(diǎn)就是處理效率比較高,很多計(jì)算都是放在客戶端進(jìn)行,服務(wù)器只負(fù)責(zé)數(shù)據(jù)轉(zhuǎn)發(fā),《王者榮耀》就可以認(rèn)為是服務(wù)器轉(zhuǎn)發(fā)的戰(zhàn)網(wǎng)服務(wù)器,但它不是一個(gè)純粹的戰(zhàn)網(wǎng)服務(wù)器,它是類似于服務(wù)器轉(zhuǎn)發(fā)的戰(zhàn)網(wǎng)服務(wù)器,經(jīng)典的戰(zhàn)網(wǎng)服務(wù)器跟MMORPG游戲服務(wù)器有兩個(gè)區(qū)別

    • MMORPG游戲服務(wù)器是分區(qū)分服的,北京區(qū)的用戶和廣州區(qū)的用戶老死不相往來(lái)

    • 戰(zhàn)網(wǎng)服務(wù)器每局游戲一般都是開房間,八個(gè)人或者十個(gè)人一起參加游戲,全國(guó)用戶都可以訪問(wèn)同一個(gè)服務(wù)器,所有玩家都可以一起進(jìn)行游戲,玩家與玩家之間使用的是P2P方式進(jìn)行連接的

    • 以前的戰(zhàn)網(wǎng)服務(wù)器只負(fù)責(zé)把玩家連接在一起,然后從所有玩家中選出一名玩家作為主機(jī),現(xiàn)在為了游戲的公平性,服務(wù)器都已經(jīng)不采用這種架構(gòu)了,而是讓所有數(shù)據(jù)都經(jīng)過(guò)服務(wù)器進(jìn)行轉(zhuǎn)發(fā),這樣就保證了客戶端玩家不太可能作弊,這種架構(gòu)比這種傳統(tǒng)的戰(zhàn)網(wǎng)服務(wù)器要安全一些,同時(shí)又不像MMORPG游戲那樣所有東西都在服務(wù)器上計(jì)算

  • 戰(zhàn)網(wǎng)服務(wù)器都包括哪些東西呢?

    • MatchMaking

      • MatchMaking服務(wù)器是用來(lái)專門做玩家的匹配服務(wù)的,它是通過(guò)創(chuàng)建房間、加入房間、自動(dòng)匹配、玩家邀請(qǐng)等等方式來(lái)組成游戲房間的

    • STUN(牽引服務(wù)器)

      • 牽引服務(wù)器的目的就是把其他玩家連接到戰(zhàn)網(wǎng)服務(wù)器當(dāng)前的主機(jī)上面,在某些情況下,比如電信和網(wǎng)通的用戶連接比較慢時(shí),戰(zhàn)網(wǎng)服務(wù)器就會(huì)設(shè)置一個(gè)轉(zhuǎn)發(fā)服務(wù)器,來(lái)轉(zhuǎn)發(fā)無(wú)法聯(lián)通的玩家之間的操作

      • 其實(shí)王者榮耀也是采用這樣的方式,所有的數(shù)據(jù)都要經(jīng)過(guò)服務(wù)器轉(zhuǎn)發(fā)一遍

第三代服務(wù)器的困境

  • 比較接近現(xiàn)代游戲服務(wù)器的第三代游戲服務(wù)器已經(jīng)講完了,那么這種現(xiàn)代的游戲服務(wù)器它又存在哪些困境呢?

  • 1,服務(wù)器的可擴(kuò)展性比較差

    • 每一個(gè)服務(wù)器都承擔(dān)了獨(dú)立的功能,沒(méi)辦法按照業(yè)務(wù)邏輯靈活劃分服務(wù)器

  • 2,可調(diào)式性差

    • 現(xiàn)在的服務(wù)器有兩種形式,單線程多進(jìn)程和單進(jìn)程多線程

    • 多線程服務(wù)器的線程與線程之間可能會(huì)引發(fā)死鎖、數(shù)據(jù)不一致的問(wèn)題,死鎖問(wèn)題簡(jiǎn)單來(lái)說(shuō)就是兩個(gè)玩家同時(shí)購(gòu)買一個(gè)唯一道具導(dǎo)致兩個(gè)玩家都無(wú)法購(gòu)買道具的問(wèn)題,詳細(xì)內(nèi)容可以參考我們的vip課程

    • 單線程多進(jìn)程的形式也有一些問(wèn)題,由于客戶端和服務(wù)器都是采用腳本語(yǔ)言進(jìn)行邏輯開發(fā)的(比如Lua、Python),而這些腳本語(yǔ)言在進(jìn)行調(diào)試時(shí)只能通過(guò)打印日志來(lái)看到程序問(wèn)題,所以在出現(xiàn)問(wèn)題時(shí)想要進(jìn)行調(diào)試就會(huì)比較困難

  • 3,不能跨平臺(tái)

    • 游戲服務(wù)器最常用的就是Linux和Windows服務(wù)器,而第三代服務(wù)器不能跨Linux和Windos平臺(tái),而且第三代服務(wù)器的客戶端和服務(wù)端使用的并不是相同的語(yǔ)言,也就是使用第三代服務(wù)器開發(fā)游戲可能需要學(xué)習(xí)兩種以上的編程語(yǔ)言

  • 4,代碼繁瑣

    • 第三代服務(wù)器使用的C語(yǔ)言沒(méi)有異步這種語(yǔ)法結(jié)構(gòu),也沒(méi)有Lambda表達(dá)式、想要使用正則表達(dá)式還需要導(dǎo)入第三方庫(kù)

    • 第三代服務(wù)器的模塊化程度也不夠,不是基于組件式進(jìn)行開發(fā)的

  • 5、無(wú)法做到不停服更新

    • 如果要做不停服更新的話服務(wù)器必須要支持腳本語(yǔ)言,如ToLua、XLua

  • 6、代碼可重用性差,沒(méi)有Actor支持

    • 很多時(shí)候客戶端跟服務(wù)器的功能是相似的,但在第三代服務(wù)器中你需要寫兩份代碼功能相似的代碼,所以很難維護(hù)

    • 沒(méi)有Actor支持,就意味著無(wú)法簡(jiǎn)潔的支持大規(guī)模并發(fā)

  • 7,數(shù)據(jù)庫(kù)架構(gòu)繁瑣

    • 過(guò)去的服務(wù)器架構(gòu)用的比較多的就是使用Redis做數(shù)據(jù)緩存,用MySQL做數(shù)據(jù)庫(kù),但實(shí)際上我們只需要用一種數(shù)據(jù)庫(kù)就可以了,這種數(shù)據(jù)庫(kù)叫做Mongo

  • 8,缺乏簡(jiǎn)單、高效的網(wǎng)絡(luò)協(xié)議支持

    • 現(xiàn)在的服務(wù)器開發(fā)里都會(huì)用ProtoBuffer,所以這個(gè)問(wèn)題已經(jīng)在第四代網(wǎng)絡(luò)游戲服務(wù)器里已經(jīng)解決了

  • 9,不支持幀同步

    • TCP協(xié)議是比較安全的網(wǎng)絡(luò)通信方式,它不會(huì)出現(xiàn)數(shù)據(jù)丟包、數(shù)據(jù)包時(shí)序混亂等等問(wèn)題,但TCP數(shù)據(jù)包為了保證可靠性與安全性,犧牲了一些數(shù)據(jù)包收發(fā)的效率

    • UDP恰恰相反,它是一種不可靠的數(shù)據(jù)包傳遞方式,它會(huì)出現(xiàn)數(shù)據(jù)丟失、時(shí)序混亂等問(wèn)題,但它的傳遞的速度很快

    • 第四代游戲服務(wù)器會(huì)用到UDP協(xié)議,為了保證可靠性我們需要實(shí)現(xiàn)一個(gè)可靠UDP協(xié)議,它不會(huì)出現(xiàn)數(shù)據(jù)丟失、時(shí)序混亂等問(wèn)題

    • 因?yàn)檫^(guò)去大部分服務(wù)器架構(gòu)都是針對(duì)MMO游戲開發(fā)的,所以對(duì)幀同步支持有限,而且實(shí)現(xiàn)幀同步必須要有可靠UDP協(xié)議

    • Unity的數(shù)學(xué)和物理運(yùn)算庫(kù)是有問(wèn)題的,它會(huì)出現(xiàn)浮點(diǎn)數(shù)運(yùn)算誤差,如果你在C#中用一個(gè)非常大的浮點(diǎn)數(shù)加上一個(gè)非常小的浮點(diǎn)數(shù),在你把結(jié)果打印到日志上時(shí)就會(huì)發(fā)現(xiàn)算出來(lái)的數(shù)值跟你想象的那個(gè)不一樣

寫在最后

  • 更多學(xué)習(xí)資源請(qǐng)加QQ:1517069595或WX:alice17173獲?。ㄆ髽I(yè)級(jí)性能優(yōu)化/熱更新/Shader特效/服務(wù)器/商業(yè)項(xiàng)目實(shí)戰(zhàn)/每周直播/一對(duì)一指導(dǎo))

  • 點(diǎn)贊、關(guān)注、分享可免費(fèi)獲得配套學(xué)習(xí)資源

  • 詳細(xì)內(nèi)容可觀看下方完整視頻


深入淺出分布式服務(wù)器架構(gòu)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
平乐县| 嘉兴市| 乌兰察布市| 庄浪县| 海盐县| 乌兰察布市| 台北县| 邵阳县| 乌苏市| 新密市| 辽源市| 江津市| 盖州市| 永泰县| 蓝田县| 临安市| 襄樊市| 永胜县| 山阴县| 正蓝旗| 巴林右旗| 宁武县| 怀柔区| 吕梁市| 巴彦淖尔市| 治多县| 泾川县| 博罗县| 西林县| 天津市| 韶关市| 敖汉旗| 彰化县| 航空| 乳山市| 治县。| 湾仔区| 衡山县| 临澧县| 庐江县| 綦江县|