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