為什么要使用分布式Session
Web應(yīng)用在單機(jī)部署的情況下,Session是被單個應(yīng)用服務(wù)器存儲管理的,由于只有一個應(yīng)用服務(wù)器,用戶的所有請求都是通過它進(jìn)行響應(yīng)處理的,所以能夠很容易實現(xiàn)會話跟蹤和保持。隨著業(yè)務(wù)量的增長,系統(tǒng)架構(gòu)需要做出調(diào)整以適應(yīng)發(fā)展的需要,可能會使用分布式架構(gòu)或微服務(wù)架構(gòu),無論使用哪種架構(gòu)方式,應(yīng)用系統(tǒng)單機(jī)部署的模式已經(jīng)不能滿足需求,所以會將應(yīng)用系統(tǒng)部署到多臺應(yīng)用服務(wù)器上,用戶的請求也會通過負(fù)載均衡轉(zhuǎn)發(fā)到某個具體應(yīng)用服務(wù)器上執(zhí)行,可能會出現(xiàn)在A1系統(tǒng)登錄后創(chuàng)建并保存Session,再次發(fā)起請求,請求被轉(zhuǎn)發(fā)到A2系統(tǒng)上顯示未登錄的情況,此時單機(jī)部署模式下的Session機(jī)制已不能滿足要求。所以,在分布式架構(gòu)或微服務(wù)架構(gòu)下,必須保證一個應(yīng)用服務(wù)器上保存Session后,其它應(yīng)用服務(wù)器可以同步或共享這個Session。
分布式session管理實現(xiàn)方案
分布式Session有如下幾種實現(xiàn)方式。
1.Session復(fù)制
在支持Session復(fù)制的Web服務(wù)器上,通過修改Web服務(wù)器的配置,可以實現(xiàn)將Session同步到其它Web服務(wù)器上,達(dá)到每個Web服務(wù)器上都保存一致的Session。
優(yōu)點:代碼上不需要做支持和修改。
缺點:需要依賴支持的Web服務(wù)器,一旦更換成不支持的Web服務(wù)器就不能使用了,在數(shù)據(jù)量很大的情況下不僅占用網(wǎng)絡(luò)資源,而且會導(dǎo)致延遲。
適用場景:只適用于Web服務(wù)器比較少且Session數(shù)據(jù)量少的情況。
可用方案:開源方案tomcat-redis-session-manager,暫不支持Tomcat8。
2.Session粘滯
將用戶的每次請求都通過某種方法強(qiáng)制分發(fā)到某一個Web服務(wù)器上,只要這個Web服務(wù)器上存儲了對應(yīng)Session數(shù)據(jù),就可以實現(xiàn)會話跟蹤。
優(yōu)點:使用簡單,沒有額外開銷。
缺點:一旦某個Web服務(wù)器重啟或宕機(jī),相對應(yīng)的Session數(shù)據(jù)將會丟失,而且需要依賴負(fù)載均衡機(jī)制。
適用場景:對穩(wěn)定性要求不是很高的業(yè)務(wù)情景。
3.Session集中管理
在單獨的服務(wù)器或服務(wù)器集群上使用緩存技術(shù),如Redis存儲Session數(shù)據(jù),集中管理所有的Session,所有的Web服務(wù)器都從這個存儲介質(zhì)中存取對應(yīng)的Session,實現(xiàn)Session共享。
優(yōu)點:可靠性高,減少Web服務(wù)器的資源開銷。
缺點:實現(xiàn)上有些復(fù)雜,配置較多。
適用場景:Web服務(wù)器較多、要求高可用性的情況。
可用方案:開源方案Spring Session,也可以自己實現(xiàn),主要是重寫HttpServletRequestWrapper中的getSession方法,博主也動手寫了一個,github搜索joincat用戶,然后自取。
4.基于Cookie管理
這種方式每次發(fā)起請求的時候都需要將Session數(shù)據(jù)放到Cookie中傳遞給服務(wù)端。
優(yōu)點:不需要依賴額外外部存儲,不需要額外配置。
缺點:不安全,易被盜取或篡改;Cookie數(shù)量和長度有限制,需要消耗更多網(wǎng)絡(luò)帶寬。
適用場景:數(shù)據(jù)不重要、不敏感且數(shù)據(jù)量小的情況。
總結(jié)
這四種方式,相對來說,Session集中管理更加可靠,使用也是最多的。