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