用戶的登陸請求被轉發到tomcat1上;
假設是第一次調用getSession方法(使用true作為參數)得到session。這時session會被創建;
在創建了Session的同時,服務器會為該Session生成唯一的Session id;
程序得到session后,session.addAttribute("user", user);
然后將sesessionId返回給瀏覽器。
上述這種情況就是有狀態的請求。
如果用戶再次向服務器發送請求,假設被nginx轉發到tomcat2服務器上,tomcat2上沒有session,系統就會要求用戶再次登陸。這顯然是不合理的。
上述的情況就是session共享的問題。
解決方法:
1. session同步
tomcat支持動態將某個tomcat下的session復制到其他的tomcat中,但是這個方式是早期的企業級應用習慣的方式。現在很少使用。
這種方式在集群數量很少的時候,結果還是可以的。但是如果集群數量龐大,都需要復制session, 這時會因為網絡延遲,或者session內容非常大。
就會有隱患,數據可能會存在不一致問題。
2. session黏着
對IP或者URL進行hash, 這種會導致資源分配不均勻的情況。
因為uri比ip地址相應數量多,變化就多,因此uri-hash比ip-hash分布更均衡些。
uri-hash需要第三方軟件支持pcre-8.02.tar.gz、Nginx_upstream_hash-0.3.1.tar.gz
3. 將信息放到cookie
缺點:客戶可能會禁用cookie可以被禁用;
cookie要隨着瀏覽器傳遞,增大了傳輸的內容,
cookie大小有限制。
Firefox、Safari:4097byte,(key=value);Opera: 4096byte,(key=value)
Internet Explorer: 4096個byte,(key=value)
多字節字符計算為兩個字節。在所有瀏覽器中,任何cookie大小超過限制都被忽略,且永遠不會被設置。
4. 將session從系統中獨立出來
目前主流做法是利用redis作為session管理的實現,因為redis訪問極其快速。