Tocmat集群中最重要的交換信息就是會話消息,對某個tomcat實例某會話做的更改要同步到集群其他tomcat實例的該會話對象,這樣才能保證集群所有實例的會話數(shù)據(jù)一致。在tribes組件的基礎(chǔ)上完成這些工作就相當(dāng)容易些,tribes是tomcat實現(xiàn)的一個通信框架。
如下圖,tomcat實現(xiàn)會話同步的過程中大致會使用如下組件,現(xiàn)在假設(shè)中間的tomcat實例的會話改變了,它會通過會話管理器Manager將改變的動作消息封裝成消息然后調(diào)用集群對象Cluster,通過Cluster將消息發(fā)送出去,同時Cluster又依賴于tribes,最后消息其實是交由tribes真正發(fā)送的,通信過程是以ClusterMessage為對象傳輸?shù)模鼤缺恍蛄谢M(jìn)行傳輸,到達(dá)左邊和右邊的tomcat實例時會被反序列化,消息由tribes接收后往Cluster上傳,最后到達(dá)會話管理器Manager,Manager根據(jù)動作消息去同步會話。

所以Cluster其實就是實現(xiàn)了ChannelListener的監(jiān)聽類,當(dāng)tribes接收到消息后就會調(diào)用此監(jiān)聽器的messageReceived方法處理邏輯,此方法又會繼續(xù)往上通知Manager的messageDataReceived方法,此方法內(nèi)完成會話同步處理邏輯。關(guān)于會話具體的同步機制tomcat提供了兩種,分別是“集群增量會話管理器――DeltaManager”和“集群備份會話管理器――BackupManager”。
DeltaManager會話管理器
DeltaManager會話管理器是tomcat默認(rèn)的集群會話管理器,它主要用于集群中各個節(jié)點之間會話狀態(tài)的同步維護(hù)。集群增量會話管理器的職責(zé)是將某節(jié)點的會話該變同步到集群內(nèi)其他成員節(jié)點上,它屬于全節(jié)點復(fù)制模式,所謂全節(jié)點復(fù)制是指集群中某個節(jié)點的狀態(tài)變化后需要同步到集群中剩余的節(jié)點,非全節(jié)點方式可能只是同步到其中某個或若干節(jié)點。
在集群中全節(jié)點會話復(fù)制的一個大致步驟如下圖所示,客戶端發(fā)起一個請求,假設(shè)通過一定的負(fù)載均衡設(shè)備分發(fā)策略分到其中一個結(jié)點node1,如果還未存在session對象的話web容器將會創(chuàng)建一個會話對象,接著執(zhí)行一些邏輯處理,在對客戶端響應(yīng)之前有個重要的事情是要把session對象同步到集群中其他節(jié)點上,最后再響應(yīng)客戶端。當(dāng)客戶端第二次發(fā)起請求時,假如分發(fā)到node3節(jié)點上,由于同步了node1的session會話,所以在執(zhí)行邏輯時并不會取不到session的值。如果刪除某個會話對象則要同時通知其他節(jié)點把相應(yīng)會話刪除,如果修改了某個會話的某些屬性也同樣要更新到其他節(jié)點的會話中。

DeltaManager其實就是一個會話同步通信解決方案,除了具備上面提到的全節(jié)點復(fù)制外,它還有具有只復(fù)制會話增量的特性,增量是以一個完整請求為周期,即會將一個請求過程中所有會話修改量在響應(yīng)前進(jìn)行集群同步。往下看Tomcat具體實現(xiàn)方案。
為區(qū)分不同的動作必須要先定義好各種事件,例如會話創(chuàng)建事件、會話訪問事件、會話失效事件、獲取所有會話事件、會話增量事件、會話ID改變事件等等,實際上tomcat集群會有9種事件,集群根據(jù)這些不同的事件就可以彼此進(jìn)行通信,接收方對不同事件做不同的操作。
如下圖,例如node1節(jié)點創(chuàng)建完一個會話后,即向其他三個節(jié)點發(fā)送EVT_SESSION_CREATED事件,其他三個節(jié)點接收到此事件后則各自在自己本地創(chuàng)建一個會話,會話包含了兩個很重要的屬性――會話ID和創(chuàng)建時間,這兩個屬性都必須由node1節(jié)點跟著EVT_SESSION_CREATED一起發(fā)送出去,本地會話創(chuàng)建成功后即完成了會話創(chuàng)建同步工作,此時你通過會話ID查找集群中任意一個節(jié)點都可以找到對應(yīng)的會話。同樣對于會話訪問事件,node1向其他節(jié)點發(fā)送EVT_SESSION_ACCESSED事件及會話ID,其他節(jié)點根據(jù)會話ID找到對應(yīng)會話并更新會話最后訪問時間,以免被認(rèn)為是過期會話而被清理。類似的還有會話失效事件(同步集群銷毀某會話)、會話ID改變事件(同步集群更改會話ID)等等操作。
新聞熱點
疑難解答
圖片精選