當前位置:
首頁 > 知識 > Session共享的解決辦法

Session共享的解決辦法

問題的由來:訪問一個網站時,有兩類請求。一種請求叫做無狀態的請求,一種請求叫做有狀態。

無狀態,例如:登錄頁面,類似這種頁面,哪個tomcat給我們響應都是一樣的,不需要區分。這是我們最喜歡的。集群的動態伸縮性(增加節點,移除節點)。

有狀態,例如:系統登錄後,假如用戶的請求被轉發到tomcat1上,這時系統會寫一個當前用戶的信息放入session中。這種情況就稱為有狀態的,問題就來了。nginx負載均衡後,下一次用戶的請求就被轉發tomcat2上。tomcat2上沒有session。系統就會要求用戶去登錄,這顯然是不合理的。把這個問題稱作session共享問題。

解決的辦法:

1. session同步

tomcat支持動態將某個tomcat下的session複製到其他的tomcat中。但是這個方式是早期的企業級應用習慣的方式。現在很少使用。

Session共享的解決辦法

這種方式在集群數量很少時,結果還是可以的。但如果集群數量龐大。都需要複製session,這時會因為網路延遲,或者session的內容非常大。都會造成隱患,這時可能讀到臟數據。

2 Session黏著-放在服務端

Session共享的解決辦法

對ip地址或者域名地址進行hash;或者uri進行hash。

缺點:用戶瀏覽器的IP地址hash以後滿足單調性。會可能造成資源的分配不均衡,負載均衡就達不到到目的。有的伺服器負載過重,有的伺服器負載過輕,顯然沒有充分利用資源。

因為uri比ip地址相應數量多,變化就多,因此uri-hash比ip-hash分布更均衡些。uri-hash需要第三方軟體支持pcre-8.02.tar.gz、Nginx_upstream_hash-0.3.1.tar.gz

3 將信息放到cookie-放在客戶端

session存在伺服器端,會對伺服器產生壓力。如果將信息保存到cookie中,減輕了伺服器的壓力,同時每個客戶端的壓力也很小。因為只保存自己的信息。這種方式在實際的開發中廣泛的採用。

缺點:cookie可以被禁用,cookie要隨著瀏覽器傳遞,增大了傳輸的內容,cookie大小有限制。

4 終極的解決方案-新SSO單點登錄

將session從系統中獨立出來。Apacheshiro頂級安全框架,它的session管理就是獨立出來的。目前主流做法是利用redis作為session管理的實現,因為redis訪問極其快速。

Session共享的解決辦法

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

MediaPlayer播放音頻與視頻
spring aop的基於xml的配置

TAG:程序員小新人學習 |