聊聊Zookeeper之會話機制Session

2021-10-07 09:32:16 字數 2324 閱讀 3981

我們在伺服器啟動zookeeper的時候能得知,zk服務端對外預設埠是2181。而客戶端連線到服務端上,其本質其實就是乙個tcp連線(長連線) ,當連線正式建立起來的時候,就開起來該次會話的生命週期了。有了會話之後,後續的請求傳送,回應,心跳檢測等機制都是基於會話來實現的。那對於zk的服務端來說,如何維護管理這些會話,就是本文要聊的內容啦~

順便貼一下sessionid生成的原始碼,sessionid的生成和兩個東西相關聯,乙個是時間戳,乙個是機器id

/**其中id是機器id**/

public

static

long

initializenextsession

(long id)

session是由zk服務端來進行管理的,乙個服務端可以為多個客戶端服務,也就是說,有多個session,那這些session是怎麼樣被管理的呢?而分桶機制可以說就是其管理的乙個手段。zk服務端會維護著乙個個"桶",然後把session們分配到乙個個的桶裡面。而這個區分的維度,就是expirationtime

為什麼要如此區分呢?因為zk的服務端會在執行期間定時地對會話進行超時檢測,如果不對session進行維護的話,那在檢測的時候豈不是要遍歷所有的session?這顯然不是乙個好辦法,所以才以超時時間為維度來存放session,這樣在檢測的時候,只需要掃瞄對應的桶就可以了

那這樣的話,新的問題就來了:每個session的超時時間是乙個很分散的值,假設有1000個session,很可能就會有1000個不同的超時時間,進而有1000個桶,這樣有啥意義嗎?這就要回頭看一下expirationtime的計算公式了,再貼一下:

e xp

irat

iont

ime=

curr

entt

ime+

sess

iont

imeo

utexpirationtime_ = currenttime + sessiontimeout

expira

tion

time

=​cu

rren

ttim

e+se

ssio

ntim

eout

e xp

irat

iont

ime=

(exp

irat

iont

ime/

expi

rati

onin

terv

al+1

)∗ex

pira

tion

inte

rval

expirationtime = ( expirationtime_/expirationinterval + 1 ) * expirationinterval

expira

tion

time

=(ex

pira

tion

time

/​ex

pira

tion

inte

rval

+1)∗

expi

rati

onin

terv

al可以看到,最終得到的expirationtime是expirationinterval的倍數,而expirationinterval就是zk服務端定時檢查過期session的頻率,預設為2000毫秒。所以說,每個session的expirationtime最後都是乙個近似值,是expirationinterval的倍數,這樣的話,zk在進行掃瞄的時候,只需要掃瞄乙個桶即可。

另外讓過期時間是expirationinterval的倍數還有乙個好處就是,讓檢查時間和每個session的過期時間在乙個時間節點上。否則的話就會出現乙個問題:zk檢查完畢的1毫秒後,就有乙個session新過期了,這種情況肯定是不好。

在客戶端與服務端完成連線之後生成過期時間,這個值並不是一直不變的,而是會隨著客戶端與服務端的互動來更新。過期時間的更新,當然就伴隨著session在桶上的遷移

最簡單的一點,客戶端每向服務端傳送請求,包括讀請求和寫請求,都會觸發一次啟用,因為這預示著客戶端處於活躍狀態

而如果客戶端一直沒有讀寫請求,那麼它在timeout的三分之一時間內沒有傳送過請求的話,那麼客戶端會傳送一次ping,來觸發session的啟用。當然,如果客戶端直接斷開連線的話,那麼timeout結束後就會被服務端掃瞄到然後進行清楚了

使用者Session 會話機制

總結 在展開話題之前,先看看乙個普通的分布式站點是咋樣的?1 發生位置 使用者側 例如 瀏覽器 2 實現方式 將使用者資訊 會話資訊 儲存在cookie中,在每次請求時,將這些資訊傳送到server進行解析 一般來說,cookie儲存的會話內容都會進行加密 例如 md5 sha等 這種方式主要依賴於...

ZooKeeper 會話超時

1 會話概述 在zookeeper中,客戶端和服務端建立連線後,會話隨之建立,生成乙個全域性唯一的會話id session id 伺服器和客戶端之間維持的是乙個長連線,在session timeout時間內,伺服器會確定客戶端是否正常連線 客戶端會定時向伺服器傳送heart beat,伺服器重置下次...

ZooKeeper系統模型之會話清理

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