|
Steve Kirk MSDN Content Development Group 本文介紹了在一個(gè)分布式服務(wù)器“優(yōu)雅地?cái)U(kuò)展(scale gracefully)” Active Server Pages (ASP) 事務(wù)處理應(yīng)用程序的設(shè)計(jì)策略!皟(yōu)雅地伸 縮”意味著該應(yīng)用程序在分布到多臺(tái)計(jì)算機(jī)的同時(shí)能夠保持其功能完整性 和高效的使用能力。
在前面的一篇文章“An Active Server Interface for the Corporate Benefits Sample,”中我給出了一個(gè) ASP應(yīng)用程序。該應(yīng)用程序使用了一 個(gè)依照根據(jù)功能和可重用能力所劃分的界限來分離表示和數(shù)據(jù)服務(wù)的分層 服務(wù)模型。在本文中,我將擴(kuò)展該概念,以展示如何將事務(wù)處理性的應(yīng)用 程序分為無(wú)狀態(tài)(stateless)、封裝的、能減少對(duì)ASP Session對(duì)象緩沖 數(shù)據(jù)需要的請(qǐng)求。通過減少對(duì)Session對(duì)象的需求,你將減少對(duì)cookies的 依賴,而且可以使你的應(yīng)用程序易于在多個(gè)Microsoft IIS(Internet Information Servers,Internet信息服務(wù)器)分布。
我還將討論將無(wú)狀態(tài)對(duì)象模型用于中間層服務(wù)對(duì)象,中間層服務(wù)對(duì)象 的方法調(diào)用之間不保存對(duì)象(屬性)數(shù)據(jù)。對(duì)于你的服務(wù)對(duì)象,使用無(wú)狀 態(tài)對(duì)象模型比有狀態(tài)對(duì)象模型更加有效,因?yàn)闊o(wú)狀態(tài)模型不需要Microsoft Transaction Server (MTS,Microsoft 事務(wù)處理服務(wù)器)在每次停止對(duì)象 時(shí)設(shè)置對(duì)象屬性緩沖和在激活對(duì)象時(shí)恢復(fù)數(shù)據(jù)。通過這種方式使你的應(yīng)用 程序與 MTS友好協(xié)作,你能夠預(yù)先設(shè)置其以便有效地使用它所提供的附加 計(jì)算能力。
最后,我將展示在事務(wù)處理應(yīng)用程序中如何通過共享會(huì)話間的顯示數(shù) 據(jù)(presentation data) 來減少一個(gè)主要的數(shù)據(jù)庫(kù)查詢耗費(fèi)。檢索顯示 于用戶界面數(shù)據(jù)的工作在典型事務(wù)處理應(yīng)用程序中產(chǎn)生的查詢工作要多于 實(shí)際更改數(shù)據(jù)的數(shù)據(jù)操作。如果這些顯示數(shù)據(jù)存儲(chǔ)于共享的顯示數(shù)據(jù)緩沖 對(duì)象中,則可以被多個(gè)會(huì)話使用從一個(gè)當(dāng)前處理(in-process)緩沖中提 供給用戶界面,由此消除了后臺(tái)數(shù)據(jù)庫(kù)上的花費(fèi)大、冗余性的查詢。
本文適用于使用Microsoft Active Server Pages 2.0的n層事務(wù)處理 應(yīng)用程序。應(yīng)用程序服務(wù)由運(yùn)行在Microsoft Transaction Server 2.0并 使用帶有Microsoft Distributed Transaction Coordinator (DTC)的 Microsoft SQL Server 6.5 的COM(Component Object Model,組件對(duì)象 模型)服務(wù)器提供。
在數(shù)量上的能力
開發(fā)Microsoft Windows NT操作系統(tǒng)的服務(wù)器應(yīng)用程序的眾多優(yōu)點(diǎn)之 一是服務(wù)器的能力可通過多臺(tái)計(jì)算機(jī)分布式承擔(dān)一個(gè)應(yīng)用程序的工作而得 到提升。大量的能力可以在Microsoft新近演示的分布式環(huán)境中得到擴(kuò)展。 該分布式環(huán)境是一個(gè)運(yùn)行Windows NT Server 4.0、Microsoft SQL Server 6.5、Distributed Transaction Coordinator和Microsoft Transaction Server的小型計(jì)算機(jī)工作組,能夠以每天十億次的速度進(jìn)行銀行事務(wù)處理 (大約是世界銀行事務(wù)處理量的四分之一)。
如果你使用無(wú)狀態(tài)請(qǐng)求模型設(shè)計(jì)ASP應(yīng)用程序,你將能夠通過多臺(tái)IIS 服務(wù)器分布它,并能使用其在多臺(tái)計(jì)算機(jī)上所能擴(kuò)展的無(wú)盡能力。如果這 還不足以使你使用無(wú)狀態(tài)請(qǐng)求模型,可以再想想其它優(yōu)點(diǎn):通過封裝應(yīng)用 程序請(qǐng)求和消除對(duì)會(huì)話狀態(tài)的依賴,你的代碼片段易于被重用,你的應(yīng)用 程序也更易于維護(hù)。
Corpus Distributus
提供大數(shù)量在線事務(wù)處理(OLTP,online transaction processing) 的 分布式Internet服務(wù)器包括下面幾部分:
HTTP服務(wù)器. 獨(dú)立的IIS服務(wù)器組成的系統(tǒng),使用任何分布或裝入平衡 (load-balancing)策略,對(duì)Internet上的HTTP請(qǐng)求提供服務(wù)。隨著對(duì)任 一種資源的需求的不斷增長(zhǎng),該種資源或分支的搜尋路徑可以傳遞到一臺(tái) 未充分利用的計(jì)算機(jī)。為了利用這種強(qiáng)大的分布能力,你的應(yīng)用程序需要 封裝HTTP請(qǐng)求以便它們提供所有必要信息來滿足請(qǐng)求。通過減少對(duì)請(qǐng)求間 的客戶端所提供的服務(wù)器緩沖的依賴,應(yīng)用程序請(qǐng)求集成為無(wú)狀態(tài)。雖然 ASP提供Session對(duì)象用于服務(wù)器上的狀態(tài)緩沖,但由于Session對(duì)象不能 在 IIS服務(wù)器間共享,所以對(duì)這種特性的依賴可能會(huì)限制了一個(gè)應(yīng)用程序 的伸縮能力。而且由于檢索會(huì)話數(shù)據(jù)的會(huì)話標(biāo)記符(session identifier) 作為一個(gè)cookie傳送到了瀏覽器,在用戶的瀏覽器缺乏對(duì) cookies的支持 或用戶設(shè)置為拒絕cookies時(shí),使用ASP Session對(duì)象會(huì)使你的應(yīng)用程序走 向運(yùn)行失敗。
分層應(yīng)用服務(wù)(COM服務(wù)器). COM的中間件(middleware)層,通過采 用MTS管理的 DCOM的計(jì)算機(jī)發(fā)布,組成應(yīng)用程序。層次是根據(jù)功能和可重 用能力劃分而界定的,而實(shí)際的組件界線由資源和分布式的要求確定。客 戶端與后臺(tái)數(shù)據(jù)庫(kù)間的服務(wù)對(duì)象的分層提供了代碼重用能力、高效的資源 利用能力、數(shù)據(jù)安全、事務(wù)完整性。MTS 控制對(duì)象的實(shí)例化以便實(shí)際在應(yīng) 用程序中只有當(dāng)需要對(duì)象的服務(wù)時(shí)才得到對(duì)象的引用并在不需要對(duì)象時(shí)立 刻釋放它們。大多數(shù)對(duì)象,除了共享的顯示數(shù)據(jù)對(duì)象(presentation data object),都是無(wú)狀態(tài)的,這是由于在方法調(diào)用之間不存在數(shù)據(jù)緩沖。無(wú) 狀態(tài)對(duì)象模型減少了當(dāng) MTS為多個(gè)并發(fā)用戶分配資源時(shí)所頻繁緩沖和恢復(fù) 的數(shù)據(jù)數(shù)量。顯示數(shù)據(jù)對(duì)象是無(wú)狀態(tài)對(duì)象模型的例外,因?yàn)樗鼈児蚕頂?shù)據(jù)。 這減少了與數(shù)據(jù)庫(kù)的冗余訪問以便能夠服務(wù)于多個(gè)并發(fā)用戶的用戶界面。
分布式關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)的服務(wù)器(SQL Server和DTC).后臺(tái)數(shù)據(jù)庫(kù) 管理系統(tǒng)提供了持久的數(shù)據(jù)服務(wù),管理資源的場(chǎng)所(DTC),它們被MTS下的 中間件層利用,保證了多SQL Server數(shù)據(jù)庫(kù)分布的事務(wù)處理牢固性。
封裝的請(qǐng)求
如果你使用無(wú)狀態(tài)請(qǐng)求/響應(yīng)模型(應(yīng)用程序不依賴于ASP Session對(duì) 象緩沖的數(shù)據(jù))設(shè)計(jì)ASP應(yīng)用程序,你將能夠在多個(gè)IIS服務(wù)器上分布并會(huì) 意識(shí)到所能獲得的巨大能力。除了易于實(shí)現(xiàn)可伸縮性,你還能消除對(duì)客戶 端cookies的依賴。無(wú)狀態(tài)模型也鼓勵(lì)你設(shè)計(jì)你的ASP應(yīng)用程序,使之成為 可在多應(yīng)用程序中重用的請(qǐng)求/響應(yīng)對(duì)(request/response pairs) 的封 裝集合。例如,一個(gè)標(biāo)準(zhǔn)的消費(fèi)者編輯程序能夠被所在機(jī)構(gòu)內(nèi)的許多其它 應(yīng)用程序所使用。這些優(yōu)點(diǎn)所帶來的代價(jià)是減少 ASP Session對(duì)象所提供 的編程便利性,以及在請(qǐng)求 /響應(yīng)對(duì)中要包含更多數(shù)據(jù)。因?yàn)槊總(gè)請(qǐng)求包 含了用戶ID和口令或其它驗(yàn)證(authentication)數(shù)據(jù),所以你可能想進(jìn) 行加密以便保證應(yīng)用程序的安全性。如果你的應(yīng)用程序使用一個(gè)基本的 HTML界面,你可能希望用戶查看 HTML源代碼時(shí)難以看到請(qǐng)求/響應(yīng)組中的 系統(tǒng)數(shù)據(jù)。
一個(gè)沒有ASP Session緩沖的富HTTP對(duì)話(Rich HTTP Conversation) 下面的冒名HTTP請(qǐng)求和響應(yīng)序列示范了一個(gè)應(yīng)用程序如何提供用于事務(wù)處 理的富界面(rich interface),而不依賴服務(wù)器在對(duì)象中設(shè)置緩沖數(shù)據(jù)。 這個(gè)對(duì)話由一系列訪問循環(huán)組成,每個(gè)循環(huán)包含一個(gè)HTTP請(qǐng)求、應(yīng)用程序 的事務(wù)處理以及一個(gè)HTTP響應(yīng)。HTTP請(qǐng)求由該請(qǐng)求的目標(biāo)資源(即URL) 的裝入平衡調(diào)度所確定的 IIS服務(wù)器進(jìn)行處理。請(qǐng)求的完整信息足以包括 服務(wù)器向應(yīng)用程序服務(wù)提交事務(wù)處理所需的數(shù)據(jù),以及要在一個(gè)HTTP響應(yīng) 中返回用戶瀏覽器的數(shù)據(jù)。
用戶填寫登錄表單并提交表單
如果用戶選擇了一個(gè)消費(fèi)者并查詢?cè)撓M(fèi)者的詳細(xì)信息,系統(tǒng)提交下 面的請(qǐng)求。除了選擇的消費(fèi)者PKId包含在請(qǐng)求中被傳送,F(xiàn)irstCustomerId 也包含于請(qǐng)求和隨后的響應(yīng)中以便應(yīng)用程序?qū)⒂脩舴祷氐较M(fèi)者列表中相 同的段中。通過使用這種在請(qǐng)求和響應(yīng)中添加占位符的技術(shù),你不用對(duì)IIS 上的Session狀態(tài)設(shè)置緩沖就能夠保持用戶界面上的連續(xù)性。
如果用戶選擇了Edit按鈕,下面的請(qǐng)求會(huì)被發(fā)送。而如果已從消費(fèi)者 列表界面中選擇了Add Customer,則發(fā)送的請(qǐng)求是一個(gè)具有不同Action行 為且沒有CustomerId的類似請(qǐng)求。
注意 如果你確實(shí)需要在一個(gè)用戶會(huì)話中設(shè)置緩沖,就把它們寫到后 臺(tái)數(shù)據(jù)庫(kù)中。后臺(tái)數(shù)據(jù)庫(kù)是存儲(chǔ)任何必要的會(huì)話特定狀態(tài)的最佳場(chǎng)所,因 為它的設(shè)計(jì)保證了分布式系統(tǒng)中的一致性。
無(wú)狀態(tài)服務(wù)(Stateless Services)
因?yàn)榉⻊?wù)器端的應(yīng)用程序不負(fù)責(zé)保持對(duì)應(yīng)用程序中每個(gè)用戶進(jìn)行跟蹤, 它的操作只是在HTTP請(qǐng)求到達(dá)時(shí)處理它們。在文章"An Active Server Interface for the Corporate Benefits Sample." 中我曾詳細(xì)說明了一 個(gè)分層服務(wù)體系,該服務(wù)體系能夠以一種不依賴會(huì)話狀態(tài)緩沖的通用方式 處理HTTP請(qǐng)求。在這里我將著眼于服務(wù)對(duì)象的對(duì)象模型如何影響 MTS環(huán)境 下的性能。因?yàn)槟愕膽?yīng)用程序?qū)嵗拿總(gè)服務(wù)對(duì)象都要耗用服務(wù)器資源, 所以應(yīng)用程序要高效使用資源就要在使用對(duì)象前盡可能晚的得到對(duì)象引用, 并盡可能早的釋放它們。MTS 管理對(duì)象的實(shí)例化以便減少初始化的延遲, 但是不依賴于對(duì)象狀態(tài)的對(duì)象模型由于初始化的耗用較少而比依賴狀態(tài)緩 沖的對(duì)象模型的實(shí)例化過程更快一些。在你的應(yīng)用程序保持著對(duì)一個(gè)對(duì)象 的的引用時(shí),MTS 在方法調(diào)用之間停止該對(duì)象以釋放資源。有狀態(tài)對(duì)象模 型在每次引用對(duì)象時(shí)需要 MTS恢復(fù)緩沖的屬性數(shù)據(jù)值,因此在服務(wù)于較多 的并發(fā)用戶時(shí)程序效率將變低。
共享具有緩沖的顯示服務(wù)對(duì)象
當(dāng)對(duì)你的服務(wù)對(duì)象使用無(wú)狀態(tài)對(duì)象模型時(shí),對(duì)于顯示服務(wù)緩沖 (presentation services cache)是一個(gè)重要的例外情況。包含了數(shù)據(jù) 對(duì)象集合的顯示對(duì)象(Presentation object) 應(yīng)該被共享,因?yàn)闄z索數(shù) 據(jù)并保持?jǐn)?shù)據(jù)一致的費(fèi)用很高。雖然需要一些耗費(fèi)建立一個(gè)通告路徑以便 當(dāng)數(shù)據(jù)改變時(shí)能夠通知多臺(tái)計(jì)算機(jī)上的顯示數(shù)據(jù)緩沖,但同允許每個(gè)會(huì)話 在每次需要更新界面時(shí)直接查詢數(shù)據(jù)庫(kù)相比,這些費(fèi)用還是要低得多。在 一個(gè)使用顯示數(shù)據(jù)緩沖的分布式ASP應(yīng)用程序的例子中,每個(gè)ASP程序?qū)崿F(xiàn) 一個(gè)較大的應(yīng)用程序的部分功能。顯示數(shù)據(jù)對(duì)象,Application("oPcache"), 在ASP應(yīng)用程序啟動(dòng)時(shí)被初始化。當(dāng)oPcache初始化時(shí),它注冊(cè)自己為 oCaches,成為一個(gè)能被每個(gè)提供Insert、Update或Delete 服務(wù)的工具對(duì) 象所引用的獨(dú)立 COM服務(wù)器。無(wú)論何時(shí),當(dāng)一個(gè)工具對(duì)象進(jìn)行插入、更新 或刪除操作時(shí),oCaches 將得到通告并隨后通知其列表中的所有oCache對(duì) 象。
結(jié)論
提高你的 ASP應(yīng)用程序能力的最有效方式是將應(yīng)用程序分布到多臺(tái)計(jì) 算機(jī)上。這里已討論的三個(gè)策略確保你的應(yīng)用程序在多臺(tái)計(jì)算機(jī)上分布時(shí) 能夠保持功能的完整性和高效使用新增能力。要使用不需要ASP Session 對(duì)象保留會(huì)話狀態(tài)的無(wú)狀態(tài)請(qǐng)求模型。該策略避免了依靠 cookies維持對(duì) 話的連續(xù)性并使你易于在多臺(tái) IIS服務(wù)器上分布你的應(yīng)用程序。要在你的 中間層服務(wù)對(duì)象中使用無(wú)狀態(tài)對(duì)象模型以節(jié)省 MTS在每個(gè)方法調(diào)用時(shí)緩沖 和恢復(fù)屬性數(shù)據(jù)的工作。最后一點(diǎn),要在所有會(huì)話間共享包含應(yīng)用程序數(shù) 據(jù)對(duì)象集合的顯示數(shù)據(jù)對(duì)象,以減少維護(hù)用戶界面所需的冗余性數(shù)據(jù)庫(kù)查 詢的數(shù)量。
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!