開始
在閱讀關(guān)于zookeeper的session管理的時(shí)候?qū)essionId的構(gòu)成以及各個(gè)服務(wù)端采用的分桶策略印象深刻什乙,這里記錄下汰蜘。
sessionId構(gòu)造
sessionId是用于唯一標(biāo)識(shí)一個(gè)會(huì)話的妒蔚,因此需要全局的唯一性。
sessionId的初始化是使用時(shí)間戳加 server的sid進(jìn)行構(gòu)造灶似,方法如下
sessionId = ((timestamp << 24) >> 8) | (sid << 56)
時(shí)間戳左移24位幻林,接下來右移8位,這一步給sid騰出空位镀赌,最后是或上左移了56位的sid氯哮,實(shí)質(zhì)就是初始化的sessionId的高8位是server的sid,嗯商佛,這也可以看出這種做法限制我們的zookeeper集群最多為255臺(tái)喉钢。使用24的原因在于第25位在很長一段時(shí)間都是0,因此可以保證左移后為正數(shù)良姆,但是多年后還是可能出現(xiàn)負(fù)數(shù)的問題肠虽,解決辦法也很簡(jiǎn)單,改成無符號(hào)右移8位即可玛追。
分桶策略
zookeeper對(duì)客戶端連接管理時(shí)使用了分桶策略税课,什么意思呢?zookeeper不會(huì)嚴(yán)格按照超時(shí)時(shí)間點(diǎn)去判斷客戶端連接是否超時(shí)痊剖,而是根據(jù)超時(shí)時(shí)間將各個(gè)session放入到一個(gè)個(gè)時(shí)間桶里面韩玩,通過對(duì)超時(shí)時(shí)間進(jìn)行計(jì)算可以將不同的session散列到順序的序號(hào)不斷增長的桶里面,當(dāng)時(shí)間越過這個(gè)桶代表的時(shí)刻時(shí)陆馁,即認(rèn)為桶內(nèi)所有的回話超時(shí)了找颓。當(dāng)然每次會(huì)話有新的交互都需要更新會(huì)話的桶。
其他
會(huì)話關(guān)閉時(shí)需要清理該會(huì)話創(chuàng)建的所有臨時(shí)節(jié)點(diǎn)氮惯,因此要小心臨時(shí)節(jié)點(diǎn)由于會(huì)話關(guān)閉而導(dǎo)致數(shù)據(jù)丟失叮雳。