欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Tomcat集群如何同步會(huì)話

 更新時(shí)間:2017年01月01日 08:59:14   作者:seaboat 汪洋之舟  
本篇文章主要介紹了Tomcat集群如何同步會(huì)話,Tocmat集群中最重要的交換信息就是會(huì)話消息,有興趣的同學(xué)可以了解一下。

Tocmat集群中最重要的交換信息就是會(huì)話消息,對(duì)某個(gè)tomcat實(shí)例某會(huì)話做的更改要同步到集群其他tomcat實(shí)例的該會(huì)話對(duì)象,這樣才能保證集群所有實(shí)例的會(huì)話數(shù)據(jù)一致。在tribes組件的基礎(chǔ)上完成這些工作就相當(dāng)容易些,tribes是tomcat實(shí)現(xiàn)的一個(gè)通信框架。

如下圖,tomcat實(shí)現(xiàn)會(huì)話同步的過(guò)程中大致會(huì)使用如下組件,現(xiàn)在假設(shè)中間的tomcat實(shí)例的會(huì)話改變了,它會(huì)通過(guò)會(huì)話管理器Manager將改變的動(dòng)作消息封裝成消息然后調(diào)用集群對(duì)象Cluster,通過(guò)Cluster將消息發(fā)送出去,同時(shí)Cluster又依賴于tribes,最后消息其實(shí)是交由tribes真正發(fā)送的,通信過(guò)程是以ClusterMessage為對(duì)象傳輸?shù)模鼤?huì)先被序列化進(jìn)行傳輸,到達(dá)左邊和右邊的tomcat實(shí)例時(shí)會(huì)被反序列化,消息由tribes接收后往Cluster上傳,最后到達(dá)會(huì)話管理器Manager,Manager根據(jù)動(dòng)作消息去同步會(huì)話。

這里寫(xiě)圖片描述

所以Cluster其實(shí)就是實(shí)現(xiàn)了ChannelListener的監(jiān)聽(tīng)類,當(dāng)tribes接收到消息后就會(huì)調(diào)用此監(jiān)聽(tīng)器的messageReceived方法處理邏輯,此方法又會(huì)繼續(xù)往上通知Manager的messageDataReceived方法,此方法內(nèi)完成會(huì)話同步處理邏輯。關(guān)于會(huì)話具體的同步機(jī)制tomcat提供了兩種,分別是“集群增量會(huì)話管理器——DeltaManager”和“集群備份會(huì)話管理器——BackupManager”。

DeltaManager會(huì)話管理器

DeltaManager會(huì)話管理器是tomcat默認(rèn)的集群會(huì)話管理器,它主要用于集群中各個(gè)節(jié)點(diǎn)之間會(huì)話狀態(tài)的同步維護(hù)。集群增量會(huì)話管理器的職責(zé)是將某節(jié)點(diǎn)的會(huì)話該變同步到集群內(nèi)其他成員節(jié)點(diǎn)上,它屬于全節(jié)點(diǎn)復(fù)制模式,所謂全節(jié)點(diǎn)復(fù)制是指集群中某個(gè)節(jié)點(diǎn)的狀態(tài)變化后需要同步到集群中剩余的節(jié)點(diǎn),非全節(jié)點(diǎn)方式可能只是同步到其中某個(gè)或若干節(jié)點(diǎn)。

在集群中全節(jié)點(diǎn)會(huì)話復(fù)制的一個(gè)大致步驟如下圖所示,客戶端發(fā)起一個(gè)請(qǐng)求,假設(shè)通過(guò)一定的負(fù)載均衡設(shè)備分發(fā)策略分到其中一個(gè)結(jié)點(diǎn)node1,如果還未存在session對(duì)象的話web容器將會(huì)創(chuàng)建一個(gè)會(huì)話對(duì)象,接著執(zhí)行一些邏輯處理,在對(duì)客戶端響應(yīng)之前有個(gè)重要的事情是要把session對(duì)象同步到集群中其他節(jié)點(diǎn)上,最后再響應(yīng)客戶端。當(dāng)客戶端第二次發(fā)起請(qǐng)求時(shí),假如分發(fā)到node3節(jié)點(diǎn)上,由于同步了node1的session會(huì)話,所以在執(zhí)行邏輯時(shí)并不會(huì)取不到session的值。如果刪除某個(gè)會(huì)話對(duì)象則要同時(shí)通知其他節(jié)點(diǎn)把相應(yīng)會(huì)話刪除,如果修改了某個(gè)會(huì)話的某些屬性也同樣要更新到其他節(jié)點(diǎn)的會(huì)話中。

這里寫(xiě)圖片描述

DeltaManager其實(shí)就是一個(gè)會(huì)話同步通信解決方案,除了具備上面提到的全節(jié)點(diǎn)復(fù)制外,它還有具有只復(fù)制會(huì)話增量的特性,增量是以一個(gè)完整請(qǐng)求為周期,即會(huì)將一個(gè)請(qǐng)求過(guò)程中所有會(huì)話修改量在響應(yīng)前進(jìn)行集群同步。往下看Tomcat具體實(shí)現(xiàn)方案。
為區(qū)分不同的動(dòng)作必須要先定義好各種事件,例如會(huì)話創(chuàng)建事件、會(huì)話訪問(wèn)事件、會(huì)話失效事件、獲取所有會(huì)話事件、會(huì)話增量事件、會(huì)話ID改變事件等等,實(shí)際上tomcat集群會(huì)有9種事件,集群根據(jù)這些不同的事件就可以彼此進(jìn)行通信,接收方對(duì)不同事件做不同的操作。

如下圖,例如node1節(jié)點(diǎn)創(chuàng)建完一個(gè)會(huì)話后,即向其他三個(gè)節(jié)點(diǎn)發(fā)送EVT_SESSION_CREATED事件,其他三個(gè)節(jié)點(diǎn)接收到此事件后則各自在自己本地創(chuàng)建一個(gè)會(huì)話,會(huì)話包含了兩個(gè)很重要的屬性——會(huì)話ID和創(chuàng)建時(shí)間,這兩個(gè)屬性都必須由node1節(jié)點(diǎn)跟著EVT_SESSION_CREATED一起發(fā)送出去,本地會(huì)話創(chuàng)建成功后即完成了會(huì)話創(chuàng)建同步工作,此時(shí)你通過(guò)會(huì)話ID查找集群中任意一個(gè)節(jié)點(diǎn)都可以找到對(duì)應(yīng)的會(huì)話。同樣對(duì)于會(huì)話訪問(wèn)事件,node1向其他節(jié)點(diǎn)發(fā)送EVT_SESSION_ACCESSED事件及會(huì)話ID,其他節(jié)點(diǎn)根據(jù)會(huì)話ID找到對(duì)應(yīng)會(huì)話并更新會(huì)話最后訪問(wèn)時(shí)間,以免被認(rèn)為是過(guò)期會(huì)話而被清理。類似的還有會(huì)話失效事件(同步集群銷毀某會(huì)話)、會(huì)話ID改變事件(同步集群更改會(huì)話ID)等等操作。

這里寫(xiě)圖片描述

Tomcat使用SessionMessageImpl類定義了各種集群通信事件及操作方法,在整個(gè)集群通信過(guò)程中就是按照此類定義好的事件進(jìn)行通信,SessionMessageImpl包含的事件如下{ EVT_SESSION_CREATED、EVT_SESSION_EXPIRED、EVT_SESSION_ACCESSED、EVT_GET_ALL_SESSIONS、EVT_SESSION_DELTA、EVT_ALL_SESSION_DATA、EVT_ALL_SESSION_TRANSFERCOMPLETE、EVT_CHANGE_SESSION_ID、EVT_ALL_SESSION_NOCONTEXTMANAGER },除此之外它繼承了序列化接口(方便序列化)、集群消息接口(集群的操作)、會(huì)話消息接口(事件定義及會(huì)話操作)。

這里寫(xiě)圖片描述

集群增量會(huì)話管理器DeltaManager可以說(shuō)是通過(guò)SessionMessageImpl消息來(lái)管理DeltaSession,即根據(jù)SessionMessageImpl里面的事件響應(yīng)不同的操作。Tomcat的集群通信使用的是tribes組件(相關(guān)章節(jié)會(huì)對(duì)tribes組件詳細(xì)分析),網(wǎng)絡(luò)IO都交由tribes后應(yīng)用可以更專注邏輯處理,DeltaManager存在一個(gè)messageDataReceived(ClusterMessage cmsg)方法,此方法會(huì)在本節(jié)點(diǎn)接收到其他節(jié)點(diǎn)發(fā)送過(guò)來(lái)的消息后被調(diào)用,且傳入的參數(shù)為ClusterMessage類型,可轉(zhuǎn)化為SessionMessage類型,然后根據(jù)SessionMessage定義的9種事件做不同處理。

其中有一個(gè)事件需要關(guān)注的是EVT_SESSION_DELTA,它是對(duì)會(huì)話增量同步處理的事件,某個(gè)節(jié)點(diǎn)在一個(gè)完整的請(qǐng)求過(guò)程中對(duì)某會(huì)話相關(guān)屬性的所有操作被抽象到了DeltaRequest對(duì)象中,而DeltaRequest被序列化后會(huì)放到SessionMessage中,所以EVT_SESSION_DELTA事件處理邏輯就是從SessionMessage獲取并反序列化出DeltaRequest對(duì)象,再將DeltaRequest包含的對(duì)某個(gè)會(huì)話的所有操作同步到本地該會(huì)話中,至此完成會(huì)話增量同步。

這里寫(xiě)圖片描述

總的來(lái)說(shuō)DeltaManager就是DeltaSession的管理器,它提供了會(huì)話增量的同步方式而不是全量同步,極大提高了同步效率。

集群備份會(huì)話管理器——BackupManager

全節(jié)點(diǎn)復(fù)制的網(wǎng)絡(luò)流量隨節(jié)點(diǎn)數(shù)量增加呈平方趨勢(shì)增長(zhǎng),也正是因?yàn)檫@個(gè)因素導(dǎo)致無(wú)法構(gòu)建較大規(guī)模的集群,為了使集群節(jié)點(diǎn)能更加大,首要解決的就是數(shù)據(jù)復(fù)制時(shí)流量增長(zhǎng)的問(wèn)題,于是tomcat提出了另外一種會(huì)話管理方式,每個(gè)會(huì)話只會(huì)有一個(gè)備份,它使會(huì)話備份的網(wǎng)絡(luò)流量隨節(jié)點(diǎn)數(shù)量的增加呈線性趨勢(shì)增長(zhǎng),大大減少了網(wǎng)絡(luò)流量和邏輯操作,可構(gòu)建較大的集群。

下面看看這種方式具體的工作機(jī)制,集群一般是通過(guò)負(fù)載均衡對(duì)外提供整體服務(wù),所有節(jié)點(diǎn)被隱藏在后端組成一個(gè)整體。前面各種模式的實(shí)現(xiàn)都無(wú)需負(fù)載均衡協(xié)助,所以圖中都把負(fù)載均衡省略了。最常見(jiàn)的負(fù)載方式是前面用apache拖所有節(jié)點(diǎn),它支持將類似“326257DA6DB76F8D2E38F2C4540D1DEA.tomcat1”的會(huì)話id進(jìn)行分解,定位到tomcat集群中以tomcat1命名的節(jié)點(diǎn)上(這種方式稱為Session Stick,由apache jk模塊實(shí)現(xiàn))。

每個(gè)會(huì)話存在一個(gè)原件和一個(gè)備份,且備份與原件不會(huì)保存在同一個(gè)節(jié)點(diǎn)上,如下圖,例如當(dāng)客戶端發(fā)起請(qǐng)求后通過(guò)負(fù)載均衡被分發(fā)到tomcat1實(shí)例節(jié)點(diǎn)上,生成一個(gè)包含.tomcat1后綴的會(huì)話標(biāo)識(shí),并且tomcat1節(jié)點(diǎn)根據(jù)一定策略選出此次會(huì)話對(duì)象備份的節(jié)點(diǎn),然后將包含了{(lán)會(huì)話id,備份ip}的信息發(fā)送給tomcat2、tomcat3、tomcat4,如圖中虛線所示,這樣每個(gè)節(jié)點(diǎn)都有一個(gè)會(huì)話id、備份ip列表,即每個(gè)節(jié)點(diǎn)都有每個(gè)會(huì)話的備份ip地址。

完成上面一步后就是將會(huì)話內(nèi)容備份到備份節(jié)點(diǎn)上,假如tomcat1的s1、s2兩個(gè)會(huì)話的備份地址為tomcat2,則把會(huì)話對(duì)象備份到tomcat2中,類似的有tomcat2把s3會(huì)話備份到tomcat4,tomcat4把s4、s5兩個(gè)對(duì)話備份到tomcat3,這樣集群中所有的會(huì)話都已經(jīng)有了一份備份。當(dāng)tomcat1一直不出故障,由于Session Stick技術(shù)客戶端將一直訪問(wèn)到tomcat1節(jié)點(diǎn)上,保證一直能獲取到會(huì)話。而當(dāng)tomcat1出故障了,這時(shí)tomcat也提供了一個(gè)failover機(jī)制,apache感知到后端集群tomcat1節(jié)點(diǎn)被移除了,這時(shí)它會(huì)把請(qǐng)求隨機(jī)分配到其他任意節(jié)點(diǎn)上,接下去會(huì)有兩種情況:

①剛好分到了備份節(jié)點(diǎn)tomcat2上,此時(shí)仍能獲取到s1會(huì)話,除此之外,tomcat2還要另外做的事是將這個(gè)s1會(huì)話標(biāo)記為原件且繼續(xù)選取一個(gè)備份地址備份s1會(huì)話,這樣一來(lái)又有了備份。

②假如分到了非備份節(jié)點(diǎn)tomcat3,此時(shí)肯定找不到s1會(huì)話,于是它將向集群所有節(jié)點(diǎn)發(fā)問(wèn),“請(qǐng)問(wèn)誰(shuí)有s1會(huì)話的備份ip地址信息?”,因?yàn)橹挥衪omcat2有s1的備份地址信息,它接收到詢問(wèn)后應(yīng)答告知tomcat3節(jié)點(diǎn)s1會(huì)話的備份在tomcat2,根據(jù)這個(gè)信息就能查到s1會(huì)話了,并且tomcat3在自己本地生成s1會(huì)話并標(biāo)為原件,tomcat2上的副本不變,這樣一來(lái)同樣能找到s1會(huì)話,正常完整整個(gè)請(qǐng)求處理。

這里寫(xiě)圖片描述

接著分析Tomcat對(duì)上面機(jī)制詳細(xì)的實(shí)現(xiàn),正常情況下為了支持高效的并發(fā)操作,tomcat的所有會(huì)話集使用ConcurrentHashMap

public Object put(Object key, Object value) {
  ①實(shí)例化MapEntry,將key和value傳入,并設(shè)置源節(jié)點(diǎn)為目前節(jié)點(diǎn)。
  ②判斷本地內(nèi)存是否已包含key,如是則不僅要本地remove掉,還要跨節(jié)點(diǎn)remove。
  ③通過(guò)Round robin算法從MapMember中選擇一個(gè)作為備份節(jié)點(diǎn)。
  ④實(shí)例化一個(gè)包含MSG_BACKUP標(biāo)識(shí)的MapMessage對(duì)象并發(fā)送給備份節(jié)點(diǎn)。
  ⑤實(shí)例化一個(gè)包含MSG_PROXY標(biāo)識(shí)的MapMessage對(duì)象并發(fā)送給除了備份節(jié)點(diǎn)外的其他(代理)節(jié)點(diǎn)。
  ⑥put進(jìn)本地緩存。
}

其次,再看看它如何通過(guò)get實(shí)現(xiàn)獲取會(huì)話對(duì)象操作:

public Object get(Object key) {
 ①獲取本地的MapEntry對(duì)象,它或許直接包含了會(huì)話對(duì)象,或許包含了會(huì)話對(duì)象的存放位置信息。
 ②判斷本節(jié)點(diǎn)是否屬于源節(jié)點(diǎn),如為源節(jié)點(diǎn)則直接獲取MapEntry對(duì)象里面的會(huì)話對(duì)象并返回。
 ③判斷本節(jié)點(diǎn)是否屬于備份節(jié)點(diǎn),若為備份節(jié)點(diǎn)則直接獲取MapEntry對(duì)象里面的會(huì)話對(duì)象作為返回對(duì)象,并且還要將本節(jié)點(diǎn)升為源節(jié)點(diǎn)、重新選取一個(gè)新備份節(jié)點(diǎn),把MapEntry對(duì)象拷貝到新備份節(jié)點(diǎn)。
 ④判斷本節(jié)點(diǎn)是否屬于代理節(jié)點(diǎn),若為代理節(jié)點(diǎn)則向其他節(jié)點(diǎn)發(fā)送會(huì)話對(duì)象拷貝請(qǐng)求,“集群中誰(shuí)有此會(huì)話對(duì)象請(qǐng)發(fā)送給我”,把接收到的會(huì)話對(duì)象放到本節(jié)點(diǎn)并作為返回對(duì)象,最后將本節(jié)點(diǎn)升為源節(jié)點(diǎn)。
}

最后,看看刪除會(huì)話對(duì)象remove操作的實(shí)現(xiàn):

public Object remove(Object key) {
 ①刪除本地此MapEntry對(duì)象。
 ②廣播其他節(jié)點(diǎn)刪除此MapEntry對(duì)象。
}

通過(guò)上面三個(gè)方法已經(jīng)很清晰描述了新的Map是如何進(jìn)行跨節(jié)點(diǎn)的增刪改查的,BackupManager會(huì)話管理器就是通過(guò)這個(gè)新的Map進(jìn)行會(huì)話管理。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Linux上tomcat的虛擬主機(jī)IP映射配置(圖片服務(wù)器)

    Linux上tomcat的虛擬主機(jī)IP映射配置(圖片服務(wù)器)

    有時(shí)候我們會(huì)使用tomcat作為一個(gè)圖片資源服務(wù)器,本文主要介紹了Linux上tomcat的虛擬主機(jī)IP映射配置,通過(guò)tomcat服務(wù)器來(lái)訪問(wèn)我們的圖片,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Mac+IDEA+Tomcat配置的的方法步驟

    Mac+IDEA+Tomcat配置的的方法步驟

    本主要介紹了Mac+IDEA+Tomcat配置的的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 非常實(shí)用的Tomcat啟動(dòng)腳本實(shí)現(xiàn)方法

    非常實(shí)用的Tomcat啟動(dòng)腳本實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于非常實(shí)用的Tomcat啟動(dòng)腳本的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Tomcat具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Apache結(jié)合Tomcat實(shí)現(xiàn)動(dòng)靜分離的方法

    Apache結(jié)合Tomcat實(shí)現(xiàn)動(dòng)靜分離的方法

    這篇文章主要介紹了Apache結(jié)合Tomcat實(shí)現(xiàn)動(dòng)靜分離的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Tomcat怎么實(shí)現(xiàn)異步Servlet

    Tomcat怎么實(shí)現(xiàn)異步Servlet

    這篇文章主要介紹了Tomcat怎么實(shí)現(xiàn)異步Servlet,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。
    2017-01-01
  • 詳解Tomcat是如何實(shí)現(xiàn)異步Servlet的

    詳解Tomcat是如何實(shí)現(xiàn)異步Servlet的

    這篇文章主要介紹了詳解Tomcat是如何實(shí)現(xiàn)異步Servlet的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Tomcat服務(wù)器的啟動(dòng)及啟動(dòng)失敗可能的原因分析

    Tomcat服務(wù)器的啟動(dòng)及啟動(dòng)失敗可能的原因分析

    這篇文章主要介紹了Tomcat服務(wù)器的啟動(dòng)及啟動(dòng)失敗可能的原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 關(guān)于tomcat下啟動(dòng)solr遇到的問(wèn)題及解決

    關(guān)于tomcat下啟動(dòng)solr遇到的問(wèn)題及解決

    這篇文章主要介紹了關(guān)于tomcat下啟動(dòng)solr遇到的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Tomcat 部署程序方法步驟

    Tomcat 部署程序方法步驟

    本文主要介紹了Tomcat部署程序的方法步驟,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2016-12-12
  • 解決Eclipse最新版無(wú)法使用Tomcat插件問(wèn)題

    解決Eclipse最新版無(wú)法使用Tomcat插件問(wèn)題

    最近將下載的tomcat插件導(dǎo)入eclipse安裝目錄后無(wú)法顯示“貓咪這篇文章主要介紹了解決Eclipse最新版無(wú)法使用Tomcat插件問(wèn)題,需要的朋友可以參考下
    2018-05-05

最新評(píng)論