JBoss文檔中,有一整章節(jié)警告“你真的需要HTTP會(huì)話復(fù)制嗎?”,是的,有時(shí)候一個(gè)沒(méi)有失效轉(zhuǎn)移的高可用性方案也是可 以接受的,并且便宜。更進(jìn)一步說(shuō),失效轉(zhuǎn)移并不像你想的那樣有力。
到底失效轉(zhuǎn)移給了你什么?你們中的一些可能認(rèn)為它可以避免錯(cuò)誤。您瞧,沒(méi)有失效轉(zhuǎn)移,會(huì)話數(shù)據(jù)在服務(wù)器失效時(shí)丟失了并引起錯(cuò)誤;當(dāng)會(huì)話失效轉(zhuǎn)移,會(huì)話可以從備份中恢復(fù),并且請(qǐng)求可以由另一個(gè)實(shí)例繼續(xù)處理,客戶端不知道該失效。這可能是真的,但它不是必要的條件。
當(dāng)我定義“失效轉(zhuǎn)移”時(shí),我定義了失效轉(zhuǎn)移發(fā)生的條件:“在方法調(diào)用之間”,意味著你可以有兩個(gè)連續(xù)的到一個(gè)遠(yuǎn)程對(duì)象的方法,失效轉(zhuǎn)移將發(fā)生在個(gè)方法成功完成之后和第二個(gè)方法請(qǐng)求發(fā)出之前。
那么,在方法調(diào)用處理中間,遠(yuǎn)程服務(wù)器失效了會(huì)發(fā)生什么事情?答案是:處理將停止,大多數(shù)案例中,客戶端將看到錯(cuò)誤信息,除非該方法是等冪的(參考前文)。如果是等冪方法,一些負(fù)載均衡器足夠聰明,會(huì)在其它服務(wù)器上重試這些方法。
為什么等冪重要?因?yàn)楫?dāng)失效發(fā)生時(shí),客戶端從來(lái)不知道請(qǐng)求在哪里執(zhí)行,方法被初始化或已經(jīng)完成了?客戶端從不確定它。如果方法不是等冪的,兩次調(diào)用同樣的方法將改變系統(tǒng)狀態(tài)兩次,系統(tǒng)將處于不一致?tīng)顟B(tài)。
您可能想把所有的方法放在一個(gè)事務(wù)中就變成等冪的了。畢竟,如果錯(cuò)誤發(fā)生,事務(wù)將回滾,所有的事務(wù)狀態(tài)沒(méi)有改變。但是事實(shí)是,事務(wù)邊界不能包括所有遠(yuǎn)程方法調(diào)用。如果事務(wù)提交,在返回客戶端時(shí)網(wǎng)絡(luò)崩潰,客戶端不會(huì)知道服務(wù)器事務(wù)成功與否。
在應(yīng)用中,將所有方法變成等冪是不可能的。所以,通過(guò)失效轉(zhuǎn)移,你可以減少錯(cuò)誤,但不能避免它們!以再現(xiàn)購(gòu)物網(wǎng)站為例,假定每臺(tái)服務(wù)器實(shí)例可以同時(shí)處理100個(gè)在線用戶的請(qǐng)求。當(dāng)一臺(tái)服務(wù)器失效,沒(méi)有會(huì)話失效轉(zhuǎn)移的方案將丟失所有那100個(gè)用戶的會(huì)話數(shù)據(jù)并激怒他們;當(dāng)擁有會(huì)話失效轉(zhuǎn)移,只有20個(gè)用戶的請(qǐng)求被失效的服務(wù)器在處理過(guò)程中,只有這些用戶被錯(cuò)誤激怒了。其它80個(gè)用戶還處在思考時(shí)間(用戶行為的間隔時(shí)間)或者方法調(diào)用之間。這些用戶的會(huì)話被透明地失效轉(zhuǎn)移了。所以,你應(yīng)該考慮以下事項(xiàng):
*激怒20個(gè)和100個(gè)用戶的不同影響
*擁有失效轉(zhuǎn)移和沒(méi)有失效轉(zhuǎn)移的成本