在集群部署的情況下,應(yīng)用程序需要做出調(diào)整,主要集中在四個(gè)方面:對(duì)httpsession的處理、對(duì)緩存的處理、共享的文件系統(tǒng)、synchronized關(guān)鍵字的失效。
對(duì)httpsession的處理
對(duì)httpsession的處理最為重要,因?yàn)閷?duì)WEB程序而言,httpsession無疑是最重要的全局資源,它需要被多個(gè)web服務(wù)器所共享。
無共享的集群架構(gòu)(SNA),在這樣的集群中,每個(gè)節(jié)點(diǎn)具備完全相同的功能,并且不需要知道其他節(jié)點(diǎn)存在與否。每個(gè)節(jié)點(diǎn)JVM進(jìn)程不保持全局狀態(tài),才能夠保證n個(gè)JVM節(jié)點(diǎn)的冪等性,那些所有涉及到全局狀態(tài)的,必須放在JVM進(jìn)程之外,例如用戶ID可以使用cookie,session可以放入數(shù)據(jù)庫(kù)(這并不是一個(gè)好的選擇),文件可以放在共享存儲(chǔ)系統(tǒng)中。
也就是說httpsession的信息需要被保存在JVM進(jìn)程之外,例如分布式緩存、數(shù)據(jù)庫(kù)。
這里是方案:
1、使用會(huì)話cookie保存web服務(wù)器產(chǎn)生的sessionid為什么是sessionid而不是userid,原因在于誰也不知道除去登錄外其他人會(huì)在httpsession里干些什么
2、自定義SessionMap<String,Serializable>同步保存httpsession內(nèi)的信息
自定義SessionMap同步httpsession,在操作httpsession時(shí)不用改變調(diào)用接口,不用東張西望
3、使用分布式緩存memcached保存自定義SessionMap<String,Serializable>
4、會(huì)話膠粘
未失敗轉(zhuǎn)發(fā)的情況下沒必要在memcached和httpsession之間復(fù)制來復(fù)制去,眉來眼去
5、使用SnaFilter處理失敗轉(zhuǎn)發(fā)
6、使用HttpSessionListener實(shí)現(xiàn)SessionMap<String,Serializable>的過期
利用容器session 機(jī)制的好處,httpsession過期的時(shí)候干掉memecached里的SessionMap
下面根據(jù)web請(qǐng)求的過程分情況討論該方案:
A、登錄
根據(jù)請(qǐng)求的url判斷是否是登錄請(qǐng)求
在線人數(shù)保存在memcached里
B、 正常請(qǐng)求
C、 失敗轉(zhuǎn)發(fā)
D、登出
根據(jù)請(qǐng)求的url判斷是否是登出請(qǐng)求
E、HttpSession過期
不hack memcached,使用HttpSessionListener,sessionDestroyed事件時(shí)根據(jù)sessionid刪除memcached里的sessionMap(如果存在)
關(guān)于在線人數(shù)的統(tǒng)計(jì):在線人數(shù)存儲(chǔ)在memcached里,將在線人數(shù)與sessionMap綁定,往memcached里增加sessionMap時(shí)在線人數(shù)+1,刪除時(shí)-1.
http://www.aygfsteel.com/ronghao 榮浩原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:)