在集群環(huán)境中為了使集群中各個(gè)節(jié)點(diǎn)的會(huì)話狀態(tài)都同步,同步操作是集群重點(diǎn)解決的問題,一般來說有兩種同步策略,其一是每次同步都把整個(gè)會(huì)話對象傳給集群中其他節(jié)點(diǎn),其他節(jié)點(diǎn)更新整個(gè)會(huì)話對象;其二是對會(huì)話中增量修改的屬性進(jìn)行同步,
增量會(huì)話對象——DeltaSession
。這兩種同步方案各有優(yōu)缺點(diǎn),整個(gè)會(huì)話對象同步策略實(shí)現(xiàn)過程比較簡單方便,但會(huì)造成大量無效信息的傳輸。增量同步方式則不會(huì)傳遞無效的信息,但在實(shí)現(xiàn)上會(huì)比較復(fù)雜因?yàn)樯婕暗綄?huì)話屬性操作過程的管理。這節(jié)討論的正是增量同步方式中涉及的會(huì)話對象DeltaSession,這個(gè)對象其實(shí)是對標(biāo)準(zhǔn)會(huì)話對象的擴(kuò)展使之具備在整個(gè)請求過程記錄會(huì)話所有的增量更改。DeltaSession的類圖如下,除了繼承StandardSession類外還實(shí)現(xiàn)了Externalizable、ClusterSession、ReplicatedMapEntry三個(gè)接口,Externalizable接口主要提供對外部的對象讀寫操作,ClusterSession接口主要提供判斷集群會(huì)話是否為原始的會(huì)話操作,只有原始會(huì)話才有資格使會(huì)話過期,ReplicatedMapEntry接口提供差異復(fù)制的操作。對于DeltaSession其實(shí)就是除了繼承StandardSession特性外還要額外實(shí)現(xiàn)這三個(gè)接口。
當(dāng)客戶端發(fā)起一個(gè)請求時(shí),服務(wù)端對請求的處理可能涉及會(huì)話相關(guān)的操作,例如獲取客戶端某些屬性再根據(jù)屬性值進(jìn)行邏輯處理,而且在整個(gè)請求過程中可能涉及多次的會(huì)話操作,為了將這些改變能同步到集群的其他節(jié)點(diǎn)上,必須要有一個(gè)機(jī)制來實(shí)現(xiàn),實(shí)際上同步的顆粒度大小是很重要,顆粒度太大會(huì)導(dǎo)致同步不及時(shí),而顆粒度太小則可能導(dǎo)致傳輸及性能問題,考慮到性能及可行性,tomcat同步的顆粒度是以一個(gè)完整的請求為單位的,即從客戶端發(fā)起請求到服務(wù)器完成邏輯處理返回結(jié)果之前這段時(shí)間為同步顆粒度,
電腦資料
《增量會(huì)話對象——DeltaSession》(http://www.cfdfis.com)。這個(gè)過程中對某會(huì)話的所有操作(對同一個(gè)屬性的操作只記錄最新的操作)都會(huì)被記錄下來,如下圖,綠色箭頭表示一個(gè)完整的請求過程,期間包括了四個(gè)修改屬性操作,分別修改了屬性a、b、c、d,這四個(gè)操作會(huì)被抽象成四個(gè)動(dòng)作放進(jìn)一個(gè)列表中,集群其他節(jié)點(diǎn)獲取列表后根據(jù)這些動(dòng)作就可以對自己本地對應(yīng)的會(huì)話進(jìn)行同步。
集群成員接收到某節(jié)點(diǎn)發(fā)送過來的同步消息后,將會(huì)逐一執(zhí)行動(dòng)作集里面的每個(gè)動(dòng)作,下圖大箭頭表示同步的整個(gè)過程,最下面的為動(dòng)作集列表,一共有4個(gè)動(dòng)作,按順序首先取出第一個(gè)update1動(dòng)作,動(dòng)作對象里面包含了指定修改哪個(gè)會(huì)話的會(huì)話id,根據(jù)此id去修改會(huì)話集對應(yīng)的會(huì)話的屬性。接著把剩下的其余3個(gè)動(dòng)作執(zhí)行完畢,于是完成了會(huì)話同步。
在tomcat中會(huì)話增量的具體由DeltaSession類實(shí)現(xiàn),DeltaSession繼承了StandardSession標(biāo)準(zhǔn)會(huì)話的所有特性且增加了會(huì)話增量記錄的功能,增量記錄功能即通過動(dòng)作集實(shí)現(xiàn),動(dòng)作集被封裝在DeltaRequest類,所以DeltaSession主要通過DeltaRequest實(shí)現(xiàn)動(dòng)作集的管理,動(dòng)作集由一個(gè)LinkedList結(jié)構(gòu)保存,AttributeInfo描述了動(dòng)作的一些消息,所以一個(gè)動(dòng)作就被抽象成了一個(gè)AttributeInfo對象,它主要包含四個(gè)屬性 name(String)、value(Object)、action(int)、type(int),name表示會(huì)話的屬性名,即哪個(gè)屬性被改;value表示會(huì)話屬性名對應(yīng)的值;action表示動(dòng)作類型,可能是設(shè)置屬性也可能是刪除屬性;type表示會(huì)話哪種類別的屬性將被修改。
整個(gè)增量會(huì)話的實(shí)現(xiàn)機(jī)制就是上面所說的,會(huì)話的增量拷貝比起全量拷貝有很多好處,即使實(shí)現(xiàn)相對比較復(fù)雜。