集羣中幾種session同步解決方案的比較

1. 客戶端cookie加密

。比較好的方法是自己採用cookie機制來實現一個session,在應用中使用此session實現。

   問題:session中數據不能太多,最好只有個用戶id。

Session是另一種記錄客戶狀態的機制,不同的是Cookie保存在客戶端瀏覽器中,而Session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。

如果說Cookie機制是通過檢查客戶身上的“通行證”來確定客戶身份的話,那麼Session機制就是通過檢查服務器上的“客戶明細表”來確認客戶身份。Session相當於程序在服務器上建立的一份客戶檔案,客戶來訪的時候只需要查詢客戶檔案表就可以了。

Session保存在服務器端。爲了獲得更高的存取速度,服務器一般把Session放在內存裏。每個用戶都會有一個獨立的Session。如果Session內容過於複雜,當大量客戶訪問服務器時可能會導致內存溢出。因此,Session裏的信息應該儘量精簡。

2. application server的session複製

   可能大部分應用服務器都提供了session複製的功能來實現集羣,tomcat,jboss,was都提供了這樣的功能。

   問題:

性能隨着服務器增加急劇下降,而且容易引起廣播風暴;

session數據需要序列化,影響性能。

如何序列化,可以參考  對象的序列化和反序列化.

參考資料:

Tomcat 5集羣中的SESSION複製一

Tomcat 5集羣中的SESSION複製二

應用服務器-JBoss 4.0.2集羣指南

3. 使用數據庫保存session

   使用數據庫來保存session,就算服務器宕機了也沒事,session照樣在。

   問題:

程序需要定製;

每次請求都進行數據庫讀寫開銷不小(使用內存數據庫可以提高性能,宕機就會丟失數據。可供選擇的內存數據庫有BerkeleyDB,Mysql的內存表);

數據庫是一個單點,當然可以做數據庫的ha來解決這個問題。

4. 使用共享存儲來保存session

   和數據庫類似,就算服務器宕機了也沒事,session照樣在。使用nfs或windows文件共享都可以,或者專用的共享存儲設備。

   問題:

程序需要定製;

頻繁的進行數據的序列化和反序列化,性能是否有影響;

共享存儲是一個單點,這個可以通過raid來解決。

5. 使用memcached來保存session

   這種方式跟數據庫類似,不過因爲是內存存取的,性能自然要比數據庫好多了。

   問題:

程序需要定製,增加了工作量;

存入memcached中的數據都需要序列化,效率較低;

          memcached服務器一死,所有session全丟。memchached能不能做HA? 我也不知道,網站上沒提。

   參考資料:

應用memcached保存session會話信息

正確認識memcached的緩存失效

擴展Tomcat 6.x,使用memcached存放session信息

 

6. 使用terracotta來保存session

   跟memcached類似,但是數據不需要序列化,並且是Find-Grained Changes,性能更好。配置對原來的應用完全透明,原有程序幾乎不用做任何修改。而且terracotta本身支持HA。

問題:terracotta的HA本身進行數據複製性能如何?

參考資料:

JVM-level clustering

Terracotta集羣Tomcat實現Session同步

使用Terracotta和Tomcat建立ACTIVE-PASSIVE模式的集羣

用Spring Web Flow和Terracotta搭建Web應用

Terracotta實戰示例——集羣RIFE

Terracotta近況:轉向開源,接受度,Hibernate支持

 

附:terracotta介紹

Open Terracotta is an enterprise-class, open-source, JVM-level clustering solution. JVM-level clustering simplifies enterprise Java by enabling applications to be deployed on multiple JVMs, yet interact with each other as if they were running on the same JVM. Terracotta extends the Java Memory Model of a single JVM to include a cluster of virtual machines such that threads on one virtual machine can interact with threads on another virtual machine as if they were all on the same virtual machine with an unlimited amount of heap.

 

發佈了190 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章