資源描述:
《企業(yè)級應用系統(tǒng)體系架構(gòu)十狀態(tài)管理》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、企業(yè)級應用系統(tǒng)體系架構(gòu)(十)狀態(tài)管理ChenHaopengThursday,July08,2021References:Ted?Neward:EffectiveEnterpriseJava12狀態(tài)管理對于尋求真理的人而言,有些準則是必須遵守的,真理并非教條或無知,而是通過推理、調(diào)查、檢驗、與探究得來的。無論其意圖有多好,信仰都必須構(gòu)建在事實而非幻想之上,幻想之上的信仰是最糟糕的虛假希望?!猅homasEdison3狀態(tài)管理在企業(yè)級系統(tǒng)中,大部分工作都涉及數(shù)據(jù)處理。事實上,可以論證,企業(yè)級系統(tǒng)只做了一件事,那就是
2、數(shù)據(jù)處理。在兩層架構(gòu)的客戶/服務器系統(tǒng)時代,這還不太明顯,那時企業(yè)級程序員需要關(guān)心兩種狀態(tài):瞬時狀態(tài)(transientstate)與持久狀態(tài)(durablestate)。瞬時狀態(tài)并不算企業(yè)級數(shù)據(jù)所覆蓋的正式部分,持久狀態(tài)則是無論發(fā)生什么都需要被跟蹤的部分。4狀態(tài)管理瞬時狀態(tài)是那些企業(yè)并不關(guān)心,也不會為之流淚的數(shù)據(jù),因為在系統(tǒng)崩潰的時候,真正重要的東西決不會丟失。電子商務中的購物車是瞬時狀態(tài)典型的例子。在厚客戶端或富客戶端的應用中,瞬時狀態(tài)很容易處理:相當于客戶端進程中存儲在局部變量中的數(shù)據(jù),它們沒有被保存在持久
3、的存儲介質(zhì)中。當客戶端進程結(jié)束的時候,瞬時狀態(tài)也隨之消亡,無需為其生命周期的處理而多費心思。5狀態(tài)管理不過在瘦客戶端中,例如基于HTML瀏覽器的應用,瞬時狀態(tài)則呈現(xiàn)出另一種尺度。因為HTTP本就是無狀態(tài)的協(xié)議,自身并不具備保存每一個客戶端狀態(tài)的能力。所以要由程序員在底層協(xié)議之上自己實現(xiàn)瞬時狀態(tài)機制。另一方面則是持久狀態(tài),在談到它時人們自然就會想到“持久數(shù)據(jù)(persistentdata)”,即需要長久保存的數(shù)據(jù)。正規(guī)的說法是,如果定義了某個持久狀態(tài),那么它就絕對會被保存下來,即使遇到JVM終止甚至崩潰的情況也是如
4、此。6狀態(tài)管理持久狀態(tài)通常具有隱含的法律性或經(jīng)濟意義。在討論狀態(tài)管理時,二者的區(qū)別至關(guān)重要。因為對瞬時狀態(tài)有效的機制對持久狀態(tài)不一定有效,反之亦然。7狀態(tài)處理第1項:節(jié)省地使用HttpSession第2項:使用對象優(yōu)先的持久化來保存你的領(lǐng)域模型第3項:使用關(guān)系優(yōu)先的持久化來顯示關(guān)系模型的威力第4項:使用過程優(yōu)先的持久化來創(chuàng)建一個封裝層第5項:識別對象-層次結(jié)構(gòu)的阻抗失配(impedancemismatch)8節(jié)省地使用HttpSession在基于HTML/HTTP的應用中,為維護代表客戶端的瞬時狀態(tài),servle
5、t容器提供了一種稱為會話空間的設(shè)施,被表示為HttpSession接口。遺憾的是,這種機制并非完全免費的。首先,在服務器端為每個客戶端存儲數(shù)據(jù)將會減少該服務器上的可用資源,這意味著服務器的最大負載能力會成比例地下降。這個算式很簡單:在會話空間中保存越多的數(shù)據(jù),機器能夠處理的會話就越少。由此推導出,為了令給定的機器能夠支持盡可能多的客戶端,必須將會話的存儲量保持在最小。實際上,對于真正具備可擴展性的系統(tǒng)而言,無論何時都應該避免使用會話。如果在服務器端可以不產(chǎn)生任何為每個客戶端進行處理的開銷,那么機器的負載能力(在理
6、論上)可以到達無限,能夠支持任意多連接到它的客戶端。9節(jié)省地使用HttpSession避免使用會話的建議不單單是考慮到系統(tǒng)的可擴展性。對于在Web集群內(nèi)運行的servlet容器而言,這也是必須的。會話是駐留內(nèi)存的結(jié)構(gòu)。因為內(nèi)存是局限于特定的機器,除非Web集群有某種機制,能夠令給定客戶端的每一次請求都被傳送給同一個服務器,否則對應先前的某個請求,其后續(xù)處理可能會找不到之前存儲的會話對象。10節(jié)省地使用HttpSession有一種可能的機制可以對此提供支持:在服務器集群中,指派一個單獨的節(jié)點作為會話狀態(tài)服務器。對每
7、一個請求,無論哪個節(jié)點正在處理它,該節(jié)點都向會話狀態(tài)服務器查詢此客戶端的會話狀態(tài),然后將會話狀態(tài)通過網(wǎng)絡傳給處理此請求的節(jié)點。然而,這種機制有兩種副作用:(1)每個請求都增加了一次與會話狀態(tài)服務器之間的往返訪問,這增加了客戶端請求的等待時間。但更重要的是,(2)所有的會話狀態(tài)都被存儲在集中的服務器上,這使得集群中產(chǎn)生了一個單一故障點(singlepointoffailure)。11節(jié)省地使用HttpSession另一種可能的機制是采用P2P(peer-to-peer)方式。當一個請求進入某節(jié)點時,此節(jié)點發(fā)出一個集
8、群廣播信號,詢問其它節(jié)點是否擁有此客戶端最近的會話狀態(tài)。擁有此客戶端最近狀態(tài)的節(jié)點對此做出回答,并將該會話狀態(tài)傳遞給當前正處理請求的節(jié)點。12節(jié)省地使用HttpSession與會話相關(guān)的另一個需要注意的問題是會話的意外使用。JSP的規(guī)范清楚地陳述道,對于給定的JSP網(wǎng)頁,“打開”會話的指示(帶有session屬性的@page指示性標記),缺省地被設(shè)置為true,這意味著下