在集群部署的情況下,應用程序需要做出調整,主要集中在四個方面:對httpsession的處理、對緩存的處理、共享的文件系統、synchronized關鍵字的失效。
對httpsession的處理
對httpsession的處理最為重要,因為對WEB程序而言,httpsession無疑是最重要的全局資源,它需要被多個web服務器所共享。
無共享的集群架構(SNA),在這樣的集群中,每個節點具備完全相同的功能,并且不需要知道其他節點存在與否。每個節點JVM進程不保持全局狀態,才能夠保證n個JVM節點的冪等性,那些所有涉及到全局狀態的,必須放在JVM進程之外,例如用戶ID可以使用cookie,session可以放入數據庫(這并不是一個好的選擇),文件可以放在共享存儲系統中。
也就是說httpsession的信息需要被保存在JVM進程之外,例如分布式緩存、數據庫。
這里是方案:
1、使用會話cookie保存web服務器產生的sessionid
為什么是sessionid而不是userid,原因在于誰也不知道除去登錄外其他人會在httpsession里干些什么
2、自定義SessionMap<String,Serializable>同步保存httpsession內的信息
自定義SessionMap同步httpsession,在操作httpsession時不用改變調用接口,不用東張西望
3、使用分布式緩存memcached保存自定義SessionMap<String,Serializable>
4、會話膠粘
未失敗轉發的情況下沒必要在memcached和httpsession之間復制來復制去,眉來眼去
5、使用SnaFilter處理失敗轉發
6、使用HttpSessionListener實現SessionMap<String,Serializable>的過期
利用容器session 機制的好處,httpsession過期的時候干掉memecached里的SessionMap
下面根據web請求的過程分情況討論該方案:
A、登錄

根據請求的url判斷是否是登錄請求
在線人數保存在memcached里
B、 正常請求

C、 失敗轉發

D、登出

根據請求的url判斷是否是登出請求
E、HttpSession過期
不hack memcached,使用HttpSessionListener,sessionDestroyed事件時根據sessionid刪除memcached里的sessionMap(如果存在)
關于在線人數的統計:在線人數存儲在memcached里,將在線人數與sessionMap綁定,往memcached里增加sessionMap時在線人數+1,刪除時-1.
http://www.tkk7.com/ronghao 榮浩原創,轉載請注明出處:)
posted on 2008-09-04 14:31
ronghao 閱讀(2264)
評論(0) 編輯 收藏 所屬分類:
工作日志