作者 Gavin Terrill譯者 王翔(Vision Wang) 發(fā)布于 2007年10月10日 下午8時(shí)48分

社區(qū)
Architecture
主題
RIA,
性能和擴(kuò)展性

今天,當(dāng)我們選擇負(fù)載均衡時(shí),大部分Web應(yīng)用集群選擇基于軟件或硬件的服務(wù)器端方案,而《Digital Web Magazine》最近發(fā)表的一篇文章討論了一家公司如何在EC2支持的應(yīng)用中實(shí)現(xiàn)客戶端負(fù)載均衡。

文章從負(fù)載均衡方案的需求談起:

  • 需要在應(yīng)用服務(wù)器集群中分擔(dān)負(fù)載;
  • 溫和地應(yīng)對單個(gè)服務(wù)器的宕機(jī);
  • 確保在最終用戶端可以把這組服務(wù)器視為一個(gè)單獨(dú)的服務(wù)器。
  • 作者朱磊(音譯 Lei Zhu)分析了我們常用的服務(wù)端負(fù)載均衡手段——循環(huán)DNS(Round Robin DNS),文中提到:

    很不幸,循環(huán)DNS的主要弱點(diǎn)是不能滿足上面提到的第二個(gè)需求,當(dāng)兩臺服務(wù)器中的一臺宕機(jī)時(shí),DNS服務(wù)器仍然會繼續(xù)把請求發(fā)給它,這導(dǎo)致一半用戶無法獲得響應(yīng)。

    他還指出集群前端軟、硬件專用方案的不足:負(fù)載均衡器(Load Balancer)自己總有一個(gè)響應(yīng)數(shù)量上限,盡管可以通過循環(huán)DNS配合專用負(fù)載均衡器解決這一問題,但維護(hù)一個(gè)專用負(fù)載均衡器需要額外投入數(shù)萬美元, 而且通常后備負(fù)載均衡器只有在主設(shè)備出現(xiàn)故障后才會發(fā)揮作用。

    在客戶端負(fù)載均衡概念的介紹中,作者請讀者考慮關(guān)于桌面應(yīng)用如何負(fù)載均衡的問題:

    桌面程序隨機(jī)選擇一臺服務(wù)器,然后嘗試獲取數(shù)據(jù),如果服務(wù)器不可用或沒有在預(yù)設(shè)的時(shí)間內(nèi)響應(yīng),那么就選擇另一臺服務(wù)器,直到可以 提取數(shù)據(jù)。桌面應(yīng)用與Web應(yīng)用不同的是,前者是獨(dú)立于服務(wù)器,可以在客戶端通過對服務(wù)器訪問的負(fù)載均衡實(shí)現(xiàn)應(yīng)用的可擴(kuò)展性,而后者把客戶端代碼 (JavaScript或Flash WSF)保存在提供數(shù)據(jù)和資源的服務(wù)器上。

    為了把概念延伸到Web應(yīng)用,作者剖析了典型AJAX應(yīng)用的關(guān)鍵組成:

  • 客戶端代碼:JavaScript/Flash客戶端的SWF;
  • 資源:圖片、級聯(lián)樣式表、音頻和視頻文件、HTML文檔;
  • 服務(wù)端代碼:用于反饋客戶端所需數(shù)據(jù)的后臺邏輯。
  • 其中1、2兩類內(nèi)容相對靜止,一般不像第3類那樣有負(fù)載均衡的需要。關(guān)注于第3類組成,作者建議采用可靠的服務(wù)器或者像亞馬遜S3那樣的服務(wù),它描繪的策略如下:

    就像桌面應(yīng)用一樣,我們可以把一個(gè)應(yīng)用服務(wù)器列表嵌到客戶端代碼里,Web客戶端包括一個(gè)稱為Servers.XML的文件,它保存了可用服務(wù)器的列表??蛻舳送ㄟ^AJAX或者Flash訪問列表中的每一個(gè)服務(wù)器,直到找到一臺可響應(yīng)的。

    盡管瀏覽器可以禁止客戶端代碼向它所來源的那些服務(wù)器之外的服務(wù)器發(fā)起服務(wù)端調(diào)用,但作者還是建議采用Flash或JavaScript的方案解決這個(gè)問題。采用客戶端負(fù)載均衡有兩個(gè)好處:

  • 不需要額外的服務(wù)器設(shè)備,“不需要專用負(fù)載均衡設(shè)備,無需配置負(fù)載均衡硬件或確認(rèn)備份功能和主負(fù)載均衡器是否正常工作”;
  • 服務(wù)器可以被物理隔離,“由于是客戶端選擇服務(wù)器而不是由一個(gè)固定的負(fù)載均衡器重定向調(diào)用,所以服務(wù)器的位置不受限制”。
  • 文章結(jié)尾,作者介紹了上述技術(shù)如何在亞馬遜的EC2和S3基礎(chǔ)上構(gòu)造一個(gè)叫VoxLite的具有高可用性和可擴(kuò)展性的視頻資訊應(yīng)用,不過作者并沒有架構(gòu)出一個(gè)沒有單點(diǎn)故障的負(fù)載均衡方案。

    很多Web應(yīng)用會面向特定區(qū)域,通過一個(gè)動(dòng)態(tài)DNS支持的EC2實(shí)例實(shí)現(xiàn)調(diào)用的負(fù)載均衡。如果提供負(fù)載均衡的這個(gè)實(shí)例出現(xiàn)故障,在動(dòng)態(tài)DNS映像到另一個(gè)EC2實(shí)例前,整個(gè)系統(tǒng)就不可用了。

    為了克服這個(gè)問題,VoxLite通過向S3發(fā)起HTTP GET調(diào)用獲得可用的服務(wù)器列表,該列表由EC2實(shí)例的一系列任務(wù)維護(hù):

    1. 加載并解析http://s3.amazonaws.com/voxlite/?prefix=servers。
    2. 如果當(dāng)前運(yùn)行實(shí)例沒有被列出來,就向一批EC2實(shí)例的關(guān)鍵服務(wù)器各發(fā)送一個(gè)空文件;
    3. 通過測試到亞馬遜內(nèi)部Web服務(wù)IP地址的連接情況,可以驗(yàn)證該批其他服務(wù)器的是否運(yùn)行正常,如果無法建立連接就把該服務(wù)器從這批服務(wù)器的列表中刪掉。

    根據(jù)你的需求,客戶端負(fù)載均衡在統(tǒng)一負(fù)載均衡的架構(gòu)下,提供了一個(gè)有趣且具創(chuàng)新性的選擇。作者總結(jié)道:

    通過在客戶端負(fù)載均衡中采用S3和EC2,可以簡化搭建一個(gè)具有彈性、擴(kuò)展性、健壯性Web應(yīng)用的工作。

    查看英文原文:Client side load balancing of Ajax applications