《分布式系统:概念与设计》一2.3.2 体系结构模式
2.3.2 體系結(jié)構(gòu)模式
體系結(jié)構(gòu)模式構(gòu)建在上述討論過(guò)的相對(duì)原始的體系結(jié)構(gòu)元素之上,提供組合的、重復(fù)出現(xiàn)的結(jié)構(gòu),這些結(jié)構(gòu)在給定的環(huán)境中能運(yùn)行良好。它們未必是完整的解決方案,但當(dāng)與其他模式組合時(shí),它們會(huì)更好地引導(dǎo)設(shè)計(jì)者給出一個(gè)給定問(wèn)題域的解決方案。
這是一個(gè)大的主題,已經(jīng)有了許多用于分布式系統(tǒng)的體系結(jié)構(gòu)模式。本節(jié)中,我們給出分布式系統(tǒng)中幾個(gè)關(guān)鍵的體系結(jié)構(gòu)模型,包括分層體系結(jié)構(gòu)(layering architecture)、層次化體系結(jié)構(gòu)(tiered architecture)和瘦客戶相關(guān)的概念(包括虛擬網(wǎng)絡(luò)計(jì)算的特定機(jī)制)。我們也把Web服務(wù)當(dāng)做一個(gè)體系結(jié)構(gòu)模式進(jìn)行了考察,給出了其他可以應(yīng)用在分布式系統(tǒng)中的模式。
分層 分層的概念是一個(gè)熟悉的概念,與抽象緊密相關(guān)。在分層方法中,一個(gè)復(fù)雜的系統(tǒng)被分成若干層,每層利用下層提供的服務(wù)。因此,一個(gè)給定的層提供一個(gè)軟件抽象,更高的層不清楚實(shí)現(xiàn)細(xì)節(jié),或不清楚在它下面的其他層。
就分布式系統(tǒng)而言,這等同于把服務(wù)垂直組織成服務(wù)層。一個(gè)分布式服務(wù)可由一個(gè)或多個(gè)服務(wù)器進(jìn)程提供,這些進(jìn)程相互交互,并與客戶進(jìn)程交互,維護(hù)服務(wù)中的資源在系統(tǒng)范圍內(nèi)的一致視圖。例如,在互聯(lián)網(wǎng)上基于網(wǎng)絡(luò)時(shí)間 圖2-7 分布式系統(tǒng)中軟件和硬件服務(wù)層協(xié)議(Network Time Protocol,NTP)可實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)時(shí)間服務(wù),其中,服務(wù)器進(jìn)程運(yùn)行在互聯(lián)網(wǎng)的主機(jī)上,給任一發(fā)出請(qǐng)求的客戶提供當(dāng)前的時(shí)間,51作為與服務(wù)器交互的結(jié)果,客戶調(diào)整它們的當(dāng)前時(shí)間。給定分布式系統(tǒng)的復(fù)雜性,這些服務(wù)組織成若干層經(jīng)常是有幫助的。圖2-7給出了一個(gè)分層體系結(jié)構(gòu)的常規(guī)視圖,并在第3~6章詳細(xì)敘述這個(gè)視圖的細(xì)節(jié)。
圖2-7引入了重要的術(shù)語(yǔ)——平臺(tái)和中間件,具體定義如下:
- 一個(gè)服務(wù)于分布式系統(tǒng)和應(yīng)用的平臺(tái)由最底層的硬件和軟件層組成。這些底層為其上層提供服務(wù),它們?cè)诿總€(gè)計(jì)算機(jī)中都是獨(dú)立實(shí)現(xiàn)的,提供系統(tǒng)的編程接口,方便進(jìn)程之間的通信和協(xié)調(diào)。主要的例子有Intel x86/Windows、Intel x86/Solaris、Intel x86/Mac OS X、Intel x86/Linux和ARM/Symbian。
- 1.5.1節(jié)把中間件定義成一個(gè)軟件層,其目的是屏蔽異構(gòu)性,給應(yīng)用程序員提供方便的編程模型。中間件表示成一組計(jì)算機(jī)上的進(jìn)程或?qū)ο?#xff0c;這些進(jìn)程或?qū)ο笙嗷ソ换?#xff0c;實(shí)現(xiàn)分布式應(yīng)用的通信和資源共享支持。中間件提供有用的構(gòu)造塊,構(gòu)造在分布式系統(tǒng)中一起工作的軟件組件。特別的,它通過(guò)對(duì)抽象的支持,如遠(yuǎn)程方法調(diào)用、進(jìn)程組之間的通信、事件的通知、共享數(shù)據(jù)對(duì)象在多個(gè)協(xié)作的計(jì)算機(jī)上的分布、放置和檢索、共享數(shù)據(jù)對(duì)象的復(fù)制以及多媒體數(shù)據(jù)的實(shí)時(shí)傳送,提升應(yīng)用程序通信活動(dòng)的層次。我們將在下面的2.3.3節(jié)講述這個(gè)重要的話題。
層次化體系結(jié)構(gòu) 層次化體系結(jié)構(gòu)與分層體系結(jié)構(gòu)是互補(bǔ)的。分層將服務(wù)垂直組織成抽象層,而層次化是一項(xiàng)組織給定層功能的技術(shù),它把這個(gè)功能放在合適的服務(wù)器上,或者作為第二選擇放在物理結(jié)點(diǎn)上。這個(gè)技術(shù)與圖2-7中所示的應(yīng)用和服務(wù)的組織最相關(guān),但它也可以應(yīng)用到一個(gè)分布式系統(tǒng)體系結(jié)構(gòu)的所有層。
我們先查看兩層和三層體系結(jié)構(gòu)概念。為了說(shuō)明這些概念,考慮如下對(duì)一個(gè)給定應(yīng)用的功能分解:
- 表示邏輯,涉及處理用戶交互和修改呈現(xiàn)給用戶的應(yīng)用視圖;
- 應(yīng)用邏輯,涉及與應(yīng)用相關(guān)的(也稱為業(yè)務(wù)邏輯,雖然這個(gè)概念不僅僅限于業(yè)務(wù)應(yīng)用)詳細(xì)的應(yīng)用特定處理;
- 數(shù)據(jù)邏輯,涉及應(yīng)用的持久存儲(chǔ),通常在一個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)中。
現(xiàn)在考慮用客戶-服務(wù)器技術(shù)實(shí)現(xiàn)這樣一個(gè)應(yīng)用。圖2-8a和圖2-8b分別給出了相關(guān)的兩層和三層體系結(jié)構(gòu)解決方案,以便于比較。
在兩層解決方案中,上面提及的三個(gè)方面必須被分到兩個(gè)進(jìn)程(客戶和服務(wù)器)中。通常通過(guò)分隔應(yīng)用邏輯來(lái)完成這個(gè)劃分,把一些應(yīng)用邏輯放在客戶端,剩下的放在服務(wù)器端(雖然其他解決方案也是可以的)。這個(gè)模式的好處是具有交互的低延遲,僅有調(diào)用操作的消息交換,不足是將應(yīng)用邏輯分離到不同的進(jìn)程,帶來(lái)的后果是一部分邏輯不能被另一部分直接調(diào)用。
在三層解決方案中,有從邏輯元素到物理服務(wù)器的一對(duì)一映射,因此,例如,應(yīng)用邏輯放在一個(gè)地方,能提高軟件的可維護(hù)性。每一層也都有定義明確的角色,例如,第三層僅僅是一個(gè)提供(可能是標(biāo)準(zhǔn)的)關(guān)系服務(wù)接口的數(shù)據(jù)庫(kù)。第一層也可以是一個(gè)簡(jiǎn)單的用戶界面,提供對(duì)瘦客戶的內(nèi)在支持(見(jiàn)下面的討論)。缺點(diǎn)是增加了管理三個(gè)服務(wù)器的復(fù)雜性,也增加了與每個(gè)操作相關(guān)的網(wǎng)絡(luò)流量和延遲。
注意這個(gè)方案可以推廣到n層(或多層)的解決方案,其中一個(gè)給定的應(yīng)用領(lǐng)域劃分為n個(gè)邏輯元素,每個(gè)邏輯元素映射到一個(gè)給定的服務(wù)器元素。以維基百科基于Web的可供公眾編輯的百科全書(shū)為例,它采用了多層次體系結(jié)構(gòu)來(lái)處理大量的Web請(qǐng)求(每秒請(qǐng)求高達(dá)60000頁(yè))。
AJAX的作用:在1.6節(jié)中,我們介紹了AJAX(Asynchronous Javascript And XML)是Web所使用的標(biāo)準(zhǔn)客戶-服務(wù)器交互方式的擴(kuò)展。AJAX滿足了Javascript前端程序(運(yùn)行在Web瀏覽器中)和基于服務(wù)器的后端程序(擁有描述應(yīng)用狀態(tài)的數(shù)據(jù))之間的細(xì)粒度通信的需要。概括而言,在標(biāo)準(zhǔn)的Web交互方式中,瀏覽器發(fā)送HTTP請(qǐng)求給服務(wù)器,請(qǐng)求給定URL的頁(yè)面、圖像或其他資源。服務(wù)器發(fā)送整個(gè)頁(yè)面作為應(yīng)答,這個(gè)頁(yè)面或者從服務(wù)器上的一個(gè)文件中讀取,或者由一個(gè)程序生成,取決于URL中可識(shí)別的資源類型。當(dāng)客戶收到內(nèi)容時(shí),瀏覽器根據(jù)其MIME類型(text/html、image/jpg等)相關(guān)的顯示方式呈現(xiàn)它。雖然Web頁(yè)面由不同類型的內(nèi)容項(xiàng)組成,但是整個(gè)頁(yè)面以它在html頁(yè)面定義中指定的方式由瀏覽器組合并呈現(xiàn)。
這種標(biāo)準(zhǔn)的交互方式在幾個(gè)重要的方面約束了Web應(yīng)用的開(kāi)發(fā):
- 一旦瀏覽器發(fā)送了一個(gè)請(qǐng)求新Web頁(yè)面的http請(qǐng)求,用戶不能與該頁(yè)面交互,直到新的html內(nèi)容被瀏覽器收到并呈現(xiàn)。這個(gè)時(shí)間間隔是不確定的,因?yàn)樗芟抻诰W(wǎng)絡(luò)和服務(wù)器延遲。
- 為了用來(lái)自服務(wù)器的額外數(shù)據(jù)修改當(dāng)前頁(yè)面的一小部分,也要請(qǐng)求和顯示整個(gè)新的頁(yè)面。這導(dǎo)致了對(duì)用戶應(yīng)答的延遲、客戶和服務(wù)器兩端的額外處理以及冗余的網(wǎng)絡(luò)流量。
- 客戶顯示的頁(yè)面內(nèi)容不能被更新,從而不能響應(yīng)服務(wù)器端擁有的應(yīng)用數(shù)據(jù)的變化。
Javascript是一個(gè)跨平臺(tái)、跨瀏覽器的編程語(yǔ)言,它能下載到瀏覽器中并執(zhí)行,它的引入是去除這些約束的第一步。Javascript是一個(gè)通用的語(yǔ)言,它使得用戶接口和應(yīng)用邏輯能在瀏覽器窗口中被編程和執(zhí)行。
AJAX是使得開(kāi)發(fā)和部署交互型Web應(yīng)用成為可能的第二步,它使得Javascript前端程序能直接從服務(wù)器程序中獲得新的數(shù)據(jù)。任何數(shù)據(jù)項(xiàng)都能被請(qǐng)求,當(dāng)前頁(yè)有選擇地更新來(lái)顯示新的值。甚至,前端能以對(duì)應(yīng)用有用的任何方式響應(yīng)新的數(shù)據(jù)。
許多Web應(yīng)用允許用戶訪問(wèn)和更新大量共享的數(shù)據(jù)集,這些數(shù)據(jù)可能會(huì)改變以響應(yīng)其他客戶的輸入或服務(wù)器收到的數(shù)據(jù)輸入。它們要求一個(gè)及時(shí)的前端組件(運(yùn)行在每個(gè)客戶瀏覽器中)來(lái)完成用戶接口動(dòng)作(如菜單選擇),也請(qǐng)求訪問(wèn)一個(gè)必須放在服務(wù)器上供共享的數(shù)據(jù)集。這樣的數(shù)據(jù)集通常太大并且是動(dòng)態(tài)的,所以不允許使用基于在用戶會(huì)話(用于客戶操縱)開(kāi)始時(shí)下載整個(gè)應(yīng)用狀態(tài)副本給客戶并供其操作的體系結(jié)構(gòu)。
圖2-9 AJAX舉例:更新足球比分AJAX是支持構(gòu)建這樣的應(yīng)用的“膠水”,它提供一套通信機(jī)制,使得運(yùn)行在一個(gè)瀏覽器中的前端組件能發(fā)送請(qǐng)求,并從運(yùn)行在服務(wù)器上的后端組件接收結(jié)果。客戶通過(guò)Javascript XmlHttpRequest對(duì)象發(fā)送請(qǐng)求,該對(duì)象管理與一個(gè)服務(wù)器進(jìn)程的HTTP交互(見(jiàn)1.6節(jié))。因?yàn)閄mlHttpRequest有一個(gè)復(fù)雜的API,且該API有些依賴瀏覽器,所以,通常通過(guò)眾多可用于支持Web應(yīng)用開(kāi)發(fā)的Javascript庫(kù)中的一個(gè)庫(kù)訪問(wèn)它。圖2-9展示了ATAX在Prototype.js Javascript庫(kù)中的使用[www.prototypejs.org]。
這個(gè)例子是一個(gè)Web應(yīng)用的片段,該應(yīng)用顯示足球比賽最新積分的頁(yè)面。用戶單擊頁(yè)面的相關(guān)行,55可以請(qǐng)求獲得單個(gè)比賽的分?jǐn)?shù)更新,其對(duì)應(yīng)著執(zhí)行示例程序的第一行。Ajax.Request對(duì)象發(fā)送一個(gè)HTTP請(qǐng)求給scores.php程序,該程序與Web頁(yè)面位于相同的服務(wù)器上。Ajax.Request對(duì)象接著返回控制,允許瀏覽器繼續(xù)應(yīng)答相同窗口或其他窗口中其他用戶的動(dòng)作。當(dāng)scores.php程序已經(jīng)獲得了最新的比分時(shí),它在一個(gè)HTTP應(yīng)答中返回該比分,因?yàn)樗且粋€(gè)onSuccess動(dòng)作,所以,它分析結(jié)果并把比分插入到當(dāng)前頁(yè)面的相關(guān)位置。頁(yè)面的其余部分不受影響,不被重載入。
這說(shuō)明了在第一層組件和第二層組件之間使用的通信類型。雖然Ajax.Request(和下層的XmlHttpRequest對(duì)象)提供同步和異步通信,但總是使用異步版本,因?yàn)橛脩艚缑鎸?duì)延遲的服務(wù)器應(yīng)答是不可接受的。
這個(gè)簡(jiǎn)單的例子說(shuō)明了在兩層應(yīng)用中AJAX的使用。在三層應(yīng)用中,服務(wù)器組件(在我們的例子中是scores.php)將發(fā)送一個(gè)請(qǐng)求給數(shù)據(jù)管理器組件(通常是發(fā)給數(shù)據(jù)庫(kù)服務(wù)器的一個(gè)SQL查詢)用于請(qǐng)求數(shù)據(jù)。這個(gè)請(qǐng)求是異步的,因?yàn)闆](méi)有理由直到請(qǐng)求被滿足后才返回控制給服務(wù)器。
AJAX機(jī)制組成了一項(xiàng)有效的技術(shù),用于在具有不確定延遲的互聯(lián)網(wǎng)環(huán)境下構(gòu)造及時(shí)的Web應(yīng)用,它已經(jīng)得到了非常廣泛的使用。Google地圖應(yīng)用[www.google.com Ⅱ]是一個(gè)突出的例子。地圖作為一個(gè)連續(xù)的256×256像素圖像(稱為圖片(tile))數(shù)組顯示。當(dāng)?shù)貓D被移動(dòng)時(shí),瀏覽器中的Javascript代碼重定位可見(jiàn)的圖片,需要填入可見(jiàn)區(qū)域的額外的圖片,可以通過(guò)AJAX調(diào)用到Google服務(wù)器去獲取。圖片一經(jīng)收到就會(huì)顯示出來(lái),但瀏覽器在等待的時(shí)候可以繼續(xù)應(yīng)答用戶的交互。
瘦客戶 分布式計(jì)算的趨勢(shì)是將復(fù)雜性從最終用戶設(shè)備移向互聯(lián)網(wǎng)服務(wù)。這點(diǎn)在向云計(jì)算(見(jiàn)第1章)發(fā)展的趨勢(shì)中最明顯,在上面討論的層次化體系結(jié)構(gòu)中也能看到。這個(gè)趨勢(shì)導(dǎo)致了對(duì)瘦客戶概念的興趣,它使得能以很少的對(duì)客戶設(shè)備的假設(shè)或需求,獲得對(duì)復(fù)雜網(wǎng)絡(luò)化服務(wù)的訪問(wèn),這些服務(wù)可以通過(guò)云解決方案提供。更具體來(lái)說(shuō), 圖2-10 瘦客戶和計(jì)算機(jī)服務(wù)器術(shù)語(yǔ)瘦客戶指的是一個(gè)軟件層,在執(zhí)行一個(gè)應(yīng)用程序或訪問(wèn)遠(yuǎn)程計(jì)算機(jī)上的服務(wù)時(shí),由該軟件層提供一個(gè)基于窗口的本地用戶界面。例如,圖2-10給出了一個(gè)瘦客戶,它在訪問(wèn)互聯(lián)網(wǎng)上的一臺(tái)計(jì)算服務(wù)器。這種方法的好處是有可能通過(guò)大量的網(wǎng)絡(luò)化服務(wù)和潛在能力極大地增加簡(jiǎn)單的本地設(shè)備(例如,智能電話和其他資源有限的設(shè)備)。56瘦客戶體系結(jié)構(gòu)的主要缺點(diǎn)是:在交互頻繁的圖形活動(dòng)(如CAD和圖像處理)中,因?yàn)榫W(wǎng)絡(luò)和操作系統(tǒng)的延遲,用戶感受到的延遲會(huì)因?yàn)樵谑菘蛻艉蛻?yīng)用進(jìn)程之間傳輸圖像和向量信息而增大到不可接受的程度。
這個(gè)概念導(dǎo)致虛擬網(wǎng)絡(luò)計(jì)算(Virtual Network Computing,VNC)的出現(xiàn)。該項(xiàng)技術(shù)首先由Olivetti和Oracle研究實(shí)驗(yàn)室的研究者引入[Richardson et al.1998]。初始的概念已經(jīng)演化成實(shí)現(xiàn),例如,RealVNC[www.realvnc.com]提供了一個(gè)軟件解決方案,Adventiq[www.adventiq.com]提供了一個(gè)基于硬件的解決方案,該方案支持在IP上傳送鍵盤(pán)、視頻和鼠標(biāo)事件(KVM-over-IP)。其他VNC實(shí)現(xiàn)包括Apple Remote Desktop、TightVNC和Aqua Connect。
VNC在概念上是簡(jiǎn)單的,即為遠(yuǎn)程訪問(wèn)提供圖形用戶界面。在這個(gè)解決方案中,VNC客戶(觀眾)通過(guò)VNC協(xié)議與VNC服務(wù)器交互。從圖形支持角度看,協(xié)議在原語(yǔ)層次上操作,基于幀緩沖區(qū),以以下操作為特色:在屏幕上的給定位置放置矩形像素?cái)?shù)據(jù)(一些解決方案如Citrix的XenApp從窗口操作方面來(lái)看在較高層次操作[www.citrix.com])。這種低層方法確保協(xié)議能工作在任何操作系統(tǒng)或應(yīng)用中。雖然這很直接,但它隱含著用戶能用不同設(shè)備從任何地方訪問(wèn)他們的計(jì)算機(jī)設(shè)施,這代表了在移動(dòng)計(jì)算方面邁出的重要的一步。
虛擬網(wǎng)絡(luò)計(jì)算已經(jīng)取代了網(wǎng)絡(luò)計(jì)算機(jī),后者是以前的瘦客戶解決方案的實(shí)現(xiàn)方法,它通過(guò)簡(jiǎn)單、廉價(jià)、完全依賴網(wǎng)絡(luò)化服務(wù)的硬件設(shè)備,從遠(yuǎn)程文件服務(wù)器下載它們的操作系統(tǒng)和用戶所需的應(yīng)用軟件。因?yàn)樗械膽?yīng)用數(shù)據(jù)和代碼由一個(gè)文件服務(wù)器存儲(chǔ),所以,用戶可以從一個(gè)網(wǎng)絡(luò)計(jì)算機(jī)遷移到另一個(gè)。事實(shí)上,虛擬網(wǎng)絡(luò)計(jì)算被證明是一個(gè)更靈活的解決方案,現(xiàn)在主宰著市場(chǎng)。
其他經(jīng)常出現(xiàn)的模式 如上所述,現(xiàn)在已有大量的體系結(jié)構(gòu)模式,且它們已被文檔化。這里給出一些關(guān)鍵的例子。
- 代理(proxy)模式是分布式系統(tǒng)中經(jīng)常出現(xiàn)的模式,其主要用于支持遠(yuǎn)程過(guò)程調(diào)用或遠(yuǎn)程方法調(diào)用的位置透明性。用這種方法,一個(gè)代理在本地地址空間中被創(chuàng)建,用于代表遠(yuǎn)程對(duì)象。這個(gè)代理提供與遠(yuǎn)程對(duì)象一樣的接口,程序員調(diào)用這個(gè)代理對(duì)象,因此無(wú)須了解交互的分布式特性。在RPC和RMI中,代理支持位置透明性的作用將在第5章做進(jìn)一步的討論。注意代理也被用于封裝其他的功能(諸如復(fù)制或緩存的放置策略等)。
- Web服務(wù)中的業(yè)務(wù)代理(brokerage)的使用能被看成是一個(gè)在可能很復(fù)雜的分布式基礎(chǔ)設(shè)施中支持互操作性的體系結(jié)構(gòu)模式。特別地,57這個(gè)模式是由服務(wù)提供商、服務(wù)請(qǐng)求者和服務(wù)代理(提供與請(qǐng)求的服務(wù)一致的服務(wù))三部分組成,如圖2-11所示。這個(gè)業(yè)務(wù)代理模式在分布式系統(tǒng)的多個(gè)領(lǐng)域被多次應(yīng)用,例如Java RMI中的注冊(cè)服務(wù)、CORBA中的名字服務(wù)(分別參見(jiàn)第5章和第8章的討論)。 圖2-11 Web服務(wù)體系結(jié)構(gòu)模式
- 反射(reflection)模式在分布式系統(tǒng)中作為支持內(nèi)省(系統(tǒng)的動(dòng)態(tài)發(fā)現(xiàn)的特性)和從中調(diào)停(動(dòng)態(tài)修改結(jié)構(gòu)或行為的能力)的手段而被持續(xù)地使用。例如,Java的內(nèi)省能力被用于RMI的實(shí)現(xiàn)中,提供通用的分發(fā)(參見(jiàn)5.4.2節(jié)的討論)。在一個(gè)反射系統(tǒng)中,標(biāo)準(zhǔn)的服務(wù)接口在基礎(chǔ)層可供使用,但元層接口也可以提供對(duì)涉及服務(wù)實(shí)現(xiàn)的組件及組件參數(shù)的訪問(wèn)。許多技術(shù)在元層可用,包括截獲到達(dá)的消息或調(diào)用、動(dòng)態(tài)發(fā)現(xiàn)由給定對(duì)象提供的接口、發(fā)現(xiàn)和適應(yīng)系統(tǒng)底層體系結(jié)構(gòu)的能力。反射被應(yīng)用于分布式系統(tǒng)中的多個(gè)領(lǐng)域,特別是反射中間件領(lǐng)域,例如,可以用于支持更多的可配置及重配置中間件體系結(jié)構(gòu)[Kon et al.2001]。
與分布式系統(tǒng)相關(guān)的體系結(jié)構(gòu)模式更多的例子可以在Bushmann等人[2007]的著作中找到。
總結(jié)
以上是生活随笔為你收集整理的《分布式系统:概念与设计》一2.3.2 体系结构模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用arcgis、matlab与R语言G
- 下一篇: php网页表格样式,HTML的表格样式