Java分布式session存儲(chǔ)解決方案圖解
前言
本文主要探討集群后不同Web服務(wù)器獲取Session數(shù)據(jù)的問(wèn)題解決方案。
Session Stick
Session Stick 方案即將客戶端的每次請(qǐng)求都轉(zhuǎn)發(fā)至同一臺(tái)服務(wù)器,這就需要負(fù)載均衡器能夠根據(jù)每次請(qǐng)求的會(huì)話標(biāo)識(shí)(SessionId)來(lái)進(jìn)行請(qǐng)求轉(zhuǎn)發(fā),如下圖所示。
這種方案實(shí)現(xiàn)比較簡(jiǎn)單,對(duì)于Web服務(wù)器來(lái)說(shuō)和單機(jī)的情況一樣。但是可能會(huì)帶來(lái)如下問(wèn)題:
如果有一臺(tái)服務(wù)器宕機(jī)或者重啟,那么這臺(tái)機(jī)器上的會(huì)話數(shù)據(jù)會(huì)全部丟失。
會(huì)話標(biāo)識(shí)是應(yīng)用層信息,那么負(fù)載均衡要將同一個(gè)會(huì)話的請(qǐng)求都保存到同一個(gè)Web服務(wù)器上的話,就需要進(jìn)行應(yīng)用層(第7層)的解析,這個(gè)開(kāi)銷(xiāo)比第4層大。
負(fù)載均衡器將變成一個(gè)有狀態(tài)的節(jié)點(diǎn),要將會(huì)話保存到具體Web服務(wù)器的映射。和無(wú)狀態(tài)節(jié)點(diǎn)相比,內(nèi)存消耗更大,容災(zāi)方面也會(huì)更麻煩。
Session Replication
Session Replication 的方案則不對(duì)負(fù)載均衡器做更改,而是在Web服務(wù)器之間增加了會(huì)話數(shù)據(jù)同步的功能,各個(gè)服務(wù)器之間通過(guò)同步保證不同Web服務(wù)器之間的Session數(shù)據(jù)的一致性,如下圖所示。
Session Replication 方案對(duì)負(fù)載均衡器不再有要求,但是同樣會(huì)帶來(lái)以下問(wèn)題:
同步Session數(shù)據(jù)會(huì)造成額外的網(wǎng)絡(luò)帶寬的開(kāi)銷(xiāo),只要Session數(shù)據(jù)有變化,就需要將新產(chǎn)生的Session數(shù)據(jù)同步到其他服務(wù)器上,服務(wù)器數(shù)量越多,同步帶來(lái)的網(wǎng)絡(luò)帶寬開(kāi)銷(xiāo)也就越大。
每臺(tái)Web服務(wù)器都需要保存全部的Session數(shù)據(jù),如果整個(gè)集群的Session數(shù)量太多的話,則對(duì)于每臺(tái)機(jī)器用于保存Session數(shù)據(jù)的占用會(huì)很?chē)?yán)重。
Session 數(shù)據(jù)集中存儲(chǔ)
Session 數(shù)據(jù)集中存儲(chǔ)方案則是將集群中的所有Session集中存儲(chǔ)起來(lái),Web服務(wù)器本身則并不存儲(chǔ)Session數(shù)據(jù),不同的Web服務(wù)器從同樣的地方來(lái)獲取Session,如下圖所示。
相對(duì)于Session Replication方案,此方案的Session數(shù)據(jù)將不保存在本機(jī),并且Web服務(wù)器之間也沒(méi)有了Session數(shù)據(jù)的復(fù)制,但是該方案存在的問(wèn)題在于:
讀寫(xiě)Session數(shù)據(jù)引入了網(wǎng)絡(luò)操作,這相對(duì)于本機(jī)的數(shù)據(jù)讀取來(lái)說(shuō),問(wèn)題就在于存在時(shí)延和不穩(wěn)定性,但是通信發(fā)生在內(nèi)網(wǎng),則問(wèn)題不大。
如果集中存儲(chǔ)Session的機(jī)器或集群出現(xiàn)問(wèn)題,則會(huì)影響應(yīng)用。
Cookie Based
Cookie Based 方案是將Session數(shù)據(jù)放在Cookie里,訪問(wèn)Web服務(wù)器的時(shí)候,再由Web服務(wù)器生成對(duì)應(yīng)的Session數(shù)據(jù),如下圖所示。
但是Cookie Based 方案依然存在不足:
Cookie長(zhǎng)度的限制。這會(huì)導(dǎo)致Session長(zhǎng)度的限制。
安全性。Seesion數(shù)據(jù)本來(lái)是服務(wù)端數(shù)據(jù),卻被保存在了客戶端,即使可以加密,但是依然存在不安全性。
帶寬消耗。這里不是指內(nèi)部Web服務(wù)器之間的寬帶消耗,而是數(shù)據(jù)中心的整體外部帶寬的消耗。
性能影響。每次HTTP請(qǐng)求和響應(yīng)都帶有Seesion數(shù)據(jù),對(duì)Web服務(wù)器來(lái)說(shuō),在同樣的處理情況下,響應(yīng)的結(jié)果輸出越少,支持的并發(fā)就會(huì)越高。
總結(jié)
前面四個(gè)方案都是可行的,但是對(duì)于大型網(wǎng)站來(lái)說(shuō),Session Sticky和Session數(shù)據(jù)集中存儲(chǔ)是比較好的方案。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java中的session對(duì)象及其常用方法小結(jié)
- Java異常 Factory method''sqlSessionFactory''rew exception;ested exception is java.lang.NoSuchMethodError:
- Java Web會(huì)話技術(shù)Session的簡(jiǎn)單使用
- 詳解Java分布式系統(tǒng)中session一致性問(wèn)題
- Java中session存儲(chǔ)Users對(duì)象實(shí)現(xiàn)記住密碼
- Java Session驗(yàn)證碼案例代碼實(shí)例解析
- 詳解Java分布式Session共享解決方案
- Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解
相關(guān)文章
java使用elasticsearch分組進(jìn)行聚合查詢(xún)過(guò)程解析
這篇文章主要介紹了java使用elasticsearch分組進(jìn)行聚合查詢(xún)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02java 多態(tài)與抽象類(lèi)詳解總結(jié)
在面向?qū)ο蟮母拍钪校械膶?duì)象都是通過(guò)類(lèi)來(lái)描繪的,但是反過(guò)來(lái),并不是所有的類(lèi)都是用來(lái)描繪對(duì)象的,如果一個(gè)類(lèi)中沒(méi)有包含足夠的信息來(lái)描繪一個(gè)具體的對(duì)象,這樣的類(lèi)就是抽象類(lèi),而多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力2021-11-11JAVA中的函數(shù)式接口Function和BiFunction詳解
這篇文章主要介紹了JAVA中的函數(shù)式接口Function和BiFunction詳解,JDK的函數(shù)式接口都加上了@FunctionalInterface注解進(jìn)行標(biāo)識(shí),但是無(wú)論是否加上該注解只要接口中只有一個(gè)抽象方法,都是函數(shù)式接口,需要的朋友可以參考下2024-01-01Java中用POI實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到Excel
這篇文章主要介紹了Java中用POI實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出到Excel,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04java fastJson轉(zhuǎn)JSON兩種常見(jiàn)的轉(zhuǎn)義操作
在實(shí)際開(kāi)發(fā)中,我們有時(shí)需要將特殊字符進(jìn)行轉(zhuǎn)義,本文主要介紹了java fastJson轉(zhuǎn)JSON兩種常見(jiàn)的轉(zhuǎn)義操作,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03了解Java虛擬機(jī)JVM的基本結(jié)構(gòu)及JVM的內(nèi)存溢出方式
這篇文章主要介紹了Java虛擬機(jī)JVM的基本結(jié)構(gòu)及JVM的內(nèi)存溢出方式,涉及到Java內(nèi)存分配相關(guān)方面的知識(shí),需要的朋友可以參考下2016-01-01Mybatis實(shí)體類(lèi)和表映射問(wèn)題(推薦)
在項(xiàng)目開(kāi)發(fā)中我們經(jīng)常會(huì)遇到表中的字段名和表對(duì)應(yīng)實(shí)體類(lèi)的屬性名稱(chēng)不一定都是完全相同的。下面小編給大家介紹下這種情況下如何解決字段名與實(shí)體類(lèi)屬性名不相同的沖突問(wèn)題。下面小編給大家?guī)?lái)了Mybatis實(shí)體類(lèi)和表映射的解決方法,小伙伴們一起學(xué)習(xí)吧2016-09-09Java實(shí)現(xiàn)數(shù)獨(dú)小游戲
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)數(shù)獨(dú)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05設(shè)置JavaScript自動(dòng)提示-Eclipse/MyEclipse
自動(dòng)提示需要2個(gè)組件,分別是:ext-4.0.2a.jsb2||spket-1.6.16.jar,需要的朋友可以參考下2016-05-05