ZooKeeper 會話超時

2021-09-07 05:27:17 字數 1775 閱讀 3792

1、會話概述

在zookeeper中,客戶端和服務端建立連線後,會話隨之建立,生成乙個全域性唯一的會話id(session id)。伺服器和客戶端之間維持的是乙個長連線,在session_timeout時間內,伺服器會確定客戶端是否正常連線(客戶端會定時向伺服器傳送heart_beat,伺服器重置下次session_timeout時間)。因此,在正常情況下,session一直有效,並且zk集群所有機器上都儲存這個session資訊。在出現網路或其它問題情況下(例如客戶端所連線的那台zk機器掛了,或是其它原因的網路閃斷),客戶端與當前連線的那台伺服器之間連線斷了,這個時候客戶端會主動在位址列表(例項化zk物件的時候傳入構造方法的那個引數connectstring)中選擇新的位址進行連線。

2、連線斷開

好了,上面基本就是伺服器與客戶端之間維持會話的過程了。在這個過程中,使用者可能會看到兩類異常connectionloss(連線斷開)和sessionexpired(session過期)。連線斷開(connectionloss)一般發生在網路的閃斷或是客戶端所連線的伺服器掛機的時候,這種情況下,zookeeper客戶端自己會首先感知到這個異常,具體邏輯是在如下方法中觸發的:一種場景是server伺服器掛了,這個時候,zk客戶端首選會捕獲異常

所以,現在對於「連線斷開」這個過程就一目了然了,核心流程如下: zk客戶端捕獲「連線斷開」異常 ——> 獲取乙個新的zk位址 ——> 嘗試連線

在這個流程中,我們可以發現,整個過程不需要開發者額外的程式介入,都是zk客戶端自己會進行的,並且,使用的會話id都是同乙個,所以結論就是:發生connectionloss的情況,應用不需要做什麼事情,等待zk客戶端建立新的連線即可。

3、會話超時

sessionexpired發生在上面藍色文字部分,這個通常是zk客戶端與伺服器的連線斷了,試圖連線上新的zk機器,但是這個過程如果耗時過長,超過了session_timeout 後還沒有成功連線上伺服器,那麼伺服器認為這個session已經結束了(伺服器無法確認是因為其它異常原因還是客戶端主動結束會話),由於在zk中,很多資料和狀態都是和會話繫結的,一旦會話失效,那麼zk就開始清除和這個會話有關的資訊,包括這個會話建立的臨時節點和註冊的所有watcher。在這之後,由於網路恢復後,客戶端可能會重新連線上伺服器,但是很不幸,伺服器會告訴客戶端乙個異常:sessionexpired(會話過期)。此時客戶端的狀態變成 closed狀態,應用要做的事情就是的看自己應用的複雜程式了,要重新例項zookeeper物件,然後重新操作所有臨時資料(包括臨時節點和註冊watcher),總之,會話超時在zk使用過程中是真實存在的。

所以這裡也簡單總結下,一旦發生會話超時,那麼儲存在zk上的所有臨時資料與註冊的訂閱者都會被移除,此時需要重新建立乙個zookeeper客戶端例項,需要自己編碼做一些額外的處理。

4、會話時間(session time)

在《zookeeper api 使用》一文中已經提到,在例項化乙個zk客戶端的時候,需要設定乙個會話的超時時間。這裡需要注意的一點是,客戶端並不是可以隨意設定這個會話超時時間,在zk伺服器端對會話超時時間是有限制的,主要是minsessiontimeout和maxsessiontimeout這兩個引數設定的。(詳細檢視這個文章《zookeeper管理員指南》)session超時時間限制,如果客戶端設定的超時時間不在這個範圍,那麼會被強制設定為最大或最小時間。 預設的session超時時間是在2 * ticktime ~ 20 * ticktime。所以,如果應用對於這個會話超時時間有特殊的需求的話,一定要和zk管理員溝通好,確認好服務端是否設定了對會話時間的限制。

tomcat 設定會話超時

1 為單個web設定session 在web.xml中新增 xml html view plain copy session config session timeout 15session timeout 單位為分鐘 session config 2 為單個servlet指定會話超時時間 在 we...

tomcat 會話超時設定

1 為單個web設定session 在web.xml中新增 xml html view plain copy 15session timeout 單位為分鐘 session config 2 為單個servlet指定會話超時時間 在web.xml中新增 xml html view plain cop...

ZooKeeper系統模型之會話清理

zookeeper系統模型之會話清理。當sessiontracker的會話超時檢查執行緒整理出一些已經過期的會話後,那麼就要開始進行會話清理了。會話清理的步驟大致可以分為以下7步。由於整個會話清理過程需要一段的時間,因此為了保證在此期間不再處理來自該客戶端的新請求,sessiontracker會首先...