企業(yè)應(yīng)用架構(gòu)模式
響應(yīng)性不同于請求處理,它是系統(tǒng)響應(yīng)請求的速度有多快。這個(gè)指標(biāo)在許多系統(tǒng)里非常重要,因?yàn)閷τ谝恍┫到y(tǒng)而言,如果其響應(yīng)太慢,用戶將難以忍受——盡管其響應(yīng)時(shí)間可能不慢。如果能夠在處理真正完成之前就給用戶一些信息表明系統(tǒng)已經(jīng)接到請求,則響應(yīng)性就會(huì)好一些。例如,進(jìn)展條。
一條關(guān)于依賴性的普遍原則:領(lǐng)域?qū)雍蛿?shù)據(jù)源層絕對不要依賴于表現(xiàn)層。
領(lǐng)域邏輯的組織可以分為三種主要的模式:事務(wù)腳本、領(lǐng)域模型以及表模塊。
事務(wù)腳本是這樣一個(gè)過程:從表示層獲得輸入、進(jìn)行校驗(yàn)和計(jì)算處理、將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫中以及調(diào)用其他系統(tǒng)的操作等。基本的組織方式是讓每個(gè)過程對應(yīng)用戶可能做的一個(gè)動(dòng)作。所以,我們可以將這一模型想像成一個(gè)動(dòng)作或業(yè)務(wù)事務(wù)的腳本。每一個(gè)動(dòng)作是由一個(gè)過程來驅(qū)動(dòng)。
在領(lǐng)域模型中,不再是由一個(gè)過程來控制用戶某一動(dòng)作的邏輯,而是由每一個(gè)對象都承擔(dān)一部分相關(guān)邏輯。
在許多方面,表模塊是事務(wù)腳本和領(lǐng)域模型的一個(gè)中間地帶。它圍繞表而非直接圍繞過程來組織領(lǐng)域邏輯,提供了更多的結(jié)構(gòu),而且更容易發(fā)現(xiàn)和移除冗余代碼。但是,你無法應(yīng)用許多在領(lǐng)域模型中可以使用的組織細(xì)粒度邏輯結(jié)構(gòu)的技術(shù),例如繼承、策略和其他面向?qū)ο蟮脑O(shè)計(jì)模式。
通常,序列化LOB(大對象Large OBject)對于用來組成應(yīng)用程序部分的相對獨(dú)立對象群而言是***的。但如果過多使用它,最終會(huì)把數(shù)據(jù)庫弄得和事務(wù)文件系統(tǒng)差不多。
對于任何繼承結(jié)構(gòu),一般都有三種選擇??梢詾橐粋€(gè)層次中的所有類建立一個(gè)表,即單表繼承;也可以為每個(gè)具體類建立一個(gè)表,即具體表繼承;或者為這個(gè)層次中每一個(gè)類建立一個(gè)表:類表繼承。
這三種方法有利有弊。單表繼承浪費(fèi)空間,但避免了連接操作;具體表繼承在超類改變時(shí)不得不改變所有表,但它也避免了連接操作,允許從一個(gè)表取得一個(gè)對象;類表繼承需要多個(gè)連接操作來載入一個(gè)對象,這樣通常損失了性能,但它是類和表之間最簡單的關(guān)系。
如果機(jī)器處在屏幕流的控制下,那么你就需要應(yīng)用控制器;如果這臺機(jī)器是在用戶的控制下,你就不要應(yīng)用控制器。
在視圖方面,可以考慮三種模式:轉(zhuǎn)換視圖、模板視圖和兩步視圖。
對任何并發(fā)程序的本質(zhì)來說,僅僅考慮正確性是不夠的,還必須考慮靈活性(即有多少并發(fā)活動(dòng)可以同時(shí)進(jìn)行)。人們常常需要犧牲一些正確性以獲取更多的靈活性,這取決于失敗的嚴(yán)重性和可能性以及人們對并發(fā)處理數(shù)據(jù)的需求。
并發(fā)問題有兩個(gè)非常重要的解決方案:一個(gè)是隔離(isolation),一個(gè)是不變性(immutability)。
在樂觀鎖和悲觀鎖之間進(jìn)行選擇的標(biāo)準(zhǔn)是:沖突的頻率與嚴(yán)重性。如果沖突很少,或者沖突的后果不會(huì)很嚴(yán)重,那么通常情況下應(yīng)該選擇樂觀鎖,因?yàn)樗艿玫礁玫牟l(fā)性,而且更容易實(shí)現(xiàn)。但是,如果沖突的結(jié)果對于用戶來說是痛苦的,那么就需要使用悲觀鎖策略。
超時(shí)控制和檢測機(jī)制處理已經(jīng)出現(xiàn)的死鎖,而其他的方法則盡力防止死鎖的發(fā)生。
跨越多個(gè)請求的事務(wù)稱為長事務(wù)。
在請求開始時(shí)啟動(dòng)事務(wù),在請求結(jié)束時(shí)提交事務(wù),這是請求事務(wù)。
另一種方法是盡可能晚打開事務(wù)。使用延遲事務(wù)時(shí),應(yīng)在事務(wù)外完成讀取數(shù)據(jù)的操作,只在修改數(shù)據(jù)的時(shí)候啟動(dòng)事務(wù)。然而,這可能會(huì)導(dǎo)致不一致讀問題。
當(dāng)可以并發(fā)執(zhí)行并且結(jié)果與以某種順序依次執(zhí)行的結(jié)果相同時(shí),事務(wù)就是可串行化的(serializable)。
如果系統(tǒng)中有很多用戶,應(yīng)該考慮使用集群來提高吞吐率。會(huì)話遷移(session migration) 允許一次會(huì)話從一臺服務(wù)器轉(zhuǎn)移到另一臺服務(wù)器,從而可以由一臺服務(wù)器處理一個(gè)請求,其他服務(wù)器處理其他的請求。與其相反的方式是服務(wù)器親和(server affinity),它要求某次特定會(huì)話的所有請求只能由同一臺服務(wù)器處理。
分布對象設(shè)計(jì)***定律:不要分布使用對象。
這種情況下,怎樣有效利用多處理器資源呢?大多數(shù)情況下是使用集群系統(tǒng)。在每一個(gè)處理器上都部署所有的對象并在其他幾個(gè)節(jié)點(diǎn)上復(fù)制它們。這樣一來,每個(gè)處理器上的對象只需用到本地調(diào)用,從而運(yùn)行更快。還可以使用細(xì)粒度接口來設(shè)計(jì)對象,從而得到更簡單的編程模型和更好的可維護(hù)性。
轉(zhuǎn)載自: 博客園 - 愛拼才會(huì)贏 - benjamin超人http://www.cnblogs.com/BenjaminYao/
【編輯推薦】