在網(wǎng)絡(luò)應(yīng)用中,“負(fù)載均衡”已經(jīng)不能算是什么新鮮話題了,從硬件到軟件,也都有了很多的方法來(lái)實(shí)現(xiàn)負(fù)載均衡。我們這里討論的負(fù)載均衡,并不是指依靠DNS轉(zhuǎn)向或其它硬件設(shè)備等所作的負(fù)載均衡,而是指在應(yīng)用層所作的負(fù)載均衡。
一般而言,只有在大型在線系統(tǒng)當(dāng)中才有必要引入負(fù)載均衡,那么,多大的系統(tǒng)才能被稱(chēng)為大型系統(tǒng)呢?比如動(dòng)輒同時(shí)在線數(shù)十萬(wàn)的網(wǎng)絡(luò)游戲,比如同時(shí)在線數(shù)在10萬(wàn)以上的WEB應(yīng)用,這些我們都可以理解為大型系統(tǒng),這本身就是一個(gè)寬泛的概念。
設(shè)計(jì)再好的服務(wù)器程序,其單個(gè)程序所能承載的同時(shí)訪問(wèn)量也是有限的,面對(duì)一個(gè)龐大且日益增長(zhǎng)的網(wǎng)絡(luò)用戶群,如何讓我們的架構(gòu)能適應(yīng)未來(lái)海量用戶訪問(wèn),這
自然就牽涉到了負(fù)載均衡問(wèn)題。支持百萬(wàn)級(jí)以上的大型在線系統(tǒng),它的架構(gòu)核心就是如何將“百萬(wàn)”這么大的一個(gè)同時(shí)在線量分?jǐn)偟矫總€(gè)單獨(dú)的服務(wù)器程序上去。真
正的邏輯處理應(yīng)該是在這最終的底層的服務(wù)器程序(如QQ游戲平臺(tái)的游戲房間服務(wù)器)上的,而在此之前所存在的那些服務(wù)器,都可以被稱(chēng)為“引路者”,它們的
作用就是將客戶端一步步引導(dǎo)到這最終的負(fù)責(zé)真正邏輯的底層服務(wù)器上去,我們計(jì)算“百萬(wàn)級(jí)在線”所需要的服務(wù)器數(shù)量,也是首先考慮這底層的邏輯服務(wù)器單個(gè)可
承載的客戶端連接量。
比如:按上篇我們所分析QQ游戲架構(gòu)而言,假設(shè)每個(gè)服務(wù)器程序最高支持2W的用戶在線(假設(shè)一臺(tái)機(jī)子只運(yùn)行一個(gè)
服務(wù)器程序),那么實(shí)現(xiàn)150萬(wàn)的在線量至少需要多少臺(tái)服務(wù)器呢?如果算得簡(jiǎn)單一點(diǎn)的話,就應(yīng)該是:150/2=75臺(tái)。當(dāng)然,這樣算起來(lái),可能并不能代
表真正的服務(wù)器數(shù)量,因?yàn)槌诉@底層的服務(wù)器外,還要包括登錄/賬號(hào)服務(wù)器以及大廳服務(wù)器。但是,由于登錄/賬號(hào)服務(wù)器和大廳服務(wù)器,它們與客戶端的連接
都屬于短連接(即:取得所需要信息后,客戶端與服務(wù)器即斷開(kāi)連接),所以,客戶端給這兩類(lèi)服務(wù)器帶來(lái)的壓力相比于長(zhǎng)連接(即:客戶端與服務(wù)器始終保持連
接)而言就要輕得多,它們的壓力主要在處理瞬間的并發(fā)訪問(wèn)上。
“短連接”,是實(shí)現(xiàn)應(yīng)用層負(fù)載均衡的基本手段!!!如果客戶端要始終與登錄/賬號(hào)服務(wù)器以及大廳服務(wù)器保持連接,那么這樣作的分層架構(gòu)將是無(wú)意義的,這也沒(méi)有辦法從根本上解決用戶量不斷增長(zhǎng)與服務(wù)器數(shù)量有限之間的矛盾。
當(dāng)然,短連接之所以可以被使用并能維護(hù)正常的游戲邏輯,是因?yàn)樵谕婕铱床坏降牡胤剑?wù)器與服務(wù)器之間進(jìn)行了大量的數(shù)據(jù)同步操作。如果一個(gè)玩家沒(méi)有登錄
到登錄服務(wù)器上去而是直接連接進(jìn)了游戲房間服務(wù)器并試圖進(jìn)行游戲,那么,由于游戲房間服務(wù)器與大廳服務(wù)器和登錄/賬號(hào)服務(wù)器之間都會(huì)有針對(duì)于玩家登錄的邏
輯維護(hù),游戲房間服務(wù)器會(huì)檢測(cè)出來(lái)該玩家之前并沒(méi)有到登錄服務(wù)器進(jìn)行必要的賬號(hào)驗(yàn)證工作,它便會(huì)將玩家踢下線。由此看來(lái),各服務(wù)器之間的數(shù)據(jù)同步,又是實(shí)
現(xiàn)負(fù)載均衡的又一必要條件了。
服務(wù)器之間的數(shù)據(jù)同步問(wèn)題,依據(jù)應(yīng)用的不同,也會(huì)呈現(xiàn)不同的實(shí)現(xiàn)方案。比如,我們?cè)谔幚硗婕业卿涍@個(gè)問(wèn)
題上。我們首先可以向玩家開(kāi)放一些默認(rèn)的登錄服務(wù)器(服務(wù)器的IP及PORT信息),當(dāng)玩家連接到當(dāng)前的登錄服務(wù)器后,由該服務(wù)器首先判斷自己同時(shí)連接的
玩家是不是超過(guò)了自定義的上限,如果是,由向與該服務(wù)器連接著的“登錄服務(wù)器管理者”(一般是一個(gè)內(nèi)部的服務(wù)器,不直接向玩家開(kāi)放)申請(qǐng)仲裁,由“登錄服
務(wù)器管理者”根據(jù)當(dāng)前各登錄服務(wù)器的負(fù)載情況選擇一個(gè)新的服務(wù)器IP和PORT信息傳給客戶端,客戶端收到這個(gè)IP和PORT信息之后重定向連接到這個(gè)新
的登錄服務(wù)器上去,完成后續(xù)的登錄驗(yàn)證過(guò)程。
這種方案的一個(gè)特點(diǎn)是,在面向玩家的一側(cè),會(huì)提供一個(gè)外部訪問(wèn)接口,而在服務(wù)器集群的內(nèi)部,會(huì)提供一個(gè)“服務(wù)器管理者”及時(shí)記錄各登錄服務(wù)器的負(fù)載情況以便客戶端需要重定向時(shí)根據(jù)策略選擇一個(gè)新的登錄接口給客戶端。
采用分布式結(jié)構(gòu)的好處是可以有效分?jǐn)傉麄€(gè)系統(tǒng)的壓力,但是,不足點(diǎn)就是對(duì)于全局信息的索引將會(huì)變得比較困難,因?yàn)槊總€(gè)單獨(dú)的底層邏輯服務(wù)器上都只是存放
了自己這一個(gè)服務(wù)器上的用戶數(shù)據(jù),它沒(méi)有辦法查找到其它服務(wù)器上的用戶數(shù)據(jù)。解決這個(gè)問(wèn)題,簡(jiǎn)單一點(diǎn)的作法,就是在集群內(nèi)部,由一個(gè)中介者,提供一個(gè)全局
的玩家列表。這個(gè)全局列表,根據(jù)需要,可以直接放在“服務(wù)器管理者”上,也可以存放在數(shù)據(jù)庫(kù)中。
對(duì)于邏輯相對(duì)獨(dú)立的應(yīng)用,全局列表的
使用機(jī)會(huì)其實(shí)并不多,最主要的作用就是用來(lái)檢測(cè)玩家是不是重復(fù)登錄了。但如果有其它的某些應(yīng)用,要使用這樣的全局列表,就會(huì)使數(shù)據(jù)同步顯得比較復(fù)雜。比
如,我們?cè)诔鬅o(wú)縫地圖的MMORPG里,如果允許跨服操作(如跨服戰(zhàn)斗、跨服交易等)的話,這時(shí)的數(shù)據(jù)同步將會(huì)變得異常復(fù)雜,也容易使處理邏輯出現(xiàn)不可
預(yù)測(cè)性。
我認(rèn)為,對(duì)于休閑平臺(tái)而言,QQ游戲的架構(gòu)已經(jīng)是比較合理的,也可以稱(chēng)之為休閑平臺(tái)的標(biāo)準(zhǔn)架構(gòu)了。那么,MMORPG一般的架構(gòu)是什么樣的呢?
MMORPG一般是把整個(gè)游戲分成若干個(gè)游戲世界組,每個(gè)組內(nèi)其實(shí)就是一個(gè)單獨(dú)的游戲世界。而不同的組之間,其數(shù)據(jù)皆是相互獨(dú)立的,并不象QQ休閑平臺(tái)
一樣所有的用戶都會(huì)有一個(gè)集中的數(shù)據(jù)存放點(diǎn),MMORPG的游戲數(shù)據(jù)是按服務(wù)器組的不同而各自存放的。玩家在登錄QQ游戲時(shí),QQ游戲相關(guān)的服務(wù)器會(huì)自動(dòng)
為玩家的登錄進(jìn)行負(fù)載均衡,選擇相對(duì)不忙的服務(wù)器為其執(zhí)行用戶驗(yàn)證并最終讓用戶選擇進(jìn)入哪一個(gè)游戲房間。但是,玩家在登錄MMORPG時(shí),卻沒(méi)有這樣的自
動(dòng)負(fù)載均衡,一般是由玩家人為地去選擇要進(jìn)入哪一個(gè)服務(wù)器組,之所以這樣,是因?yàn)楦鞣?wù)器組之間的數(shù)據(jù)是不相通的。其實(shí),細(xì)致想來(lái),MMORPG的服務(wù)器
架構(gòu)思想與休閑平臺(tái)的架構(gòu)思想有異曲同工之妙,MMORPG的思想是:可以為玩家無(wú)限地開(kāi)獨(dú)立的游戲世界(即服務(wù)器組),以滿足大型玩家在線;而休閑平臺(tái)
的思想則是:可以為玩家無(wú)限地開(kāi)游戲房間以滿足大量玩家在線。這兩種應(yīng)用,可以無(wú)限開(kāi)的都是“具有完整游戲性的游戲世界”,對(duì)于MMORPG而言,它的一
個(gè)完整的游戲地圖就是一個(gè)整體的“游戲世界”,而對(duì)于休閑平臺(tái),它的一個(gè)游戲房間就可以描述為一個(gè)“游戲世界”。如果MMORPG作成了休閑平臺(tái)那樣的全
服皆通,也不是不可以,但隨之而來(lái)的,就是要解決眾多跨服問(wèn)題,比如:好友、組隊(duì)、幫派等等的問(wèn)題,所有在傳統(tǒng)MMORPG里所定義的這些玩家組織形式的
規(guī)則可能都會(huì)因?yàn)?#8220;全服皆通”而改變。
架構(gòu)的選擇是多樣性的,確實(shí)沒(méi)有一種可以稱(chēng)得上是最好的所謂的架構(gòu),適合于當(dāng)前項(xiàng)目的,不一定就適合于另一個(gè)項(xiàng)目。針對(duì)于特定的應(yīng)用,會(huì)靈活選用不同的架構(gòu)。但有一點(diǎn),是可以說(shuō)的:不管你如何架構(gòu),你所要作的就是--要以盡可能簡(jiǎn)單的方案實(shí)現(xiàn)盡可能的穩(wěn)定、高效!