开始
在阅读关于zookeeper的session管理的时候对sessionId的构成以及各个服务端采用的分桶策略印象深刻,这里记录下。
sessionId构造
sessionId是用于唯一标识一个会话的,因此需要全局的唯一性。
sessionId的初始化是使用时间戳加 server的sid进行构造,方法如下
sessionId = ((timestamp << 24) >> 8) | (sid << 56)
时间戳左移24位,接下来右移8位,这一步给sid腾出空位,最后是或上左移了56位的sid,实质就是初始化的sessionId的高8位是server的sid,嗯,这也可以看出这种做法限制我们的zookeeper集群最多为255台。使用24的原因在于第25位在很长一段时间都是0,因此可以保证左移后为正数,但是多年后还是可能出现负数的问题,解决办法也很简单,改成无符号右移8位即可。
分桶策略
zookeeper对客户端连接管理时使用了分桶策略,什么意思呢?zookeeper不会严格按照超时时间点去判断客户端连接是否超时,而是根据超时时间将各个session放入到一个个时间桶里面,通过对超时时间进行计算可以将不同的session散列到顺序的序号不断增长的桶里面,当时间越过这个桶代表的时刻时,即认为桶内所有的回话超时了。当然每次会话有新的交互都需要更新会话的桶。
其他
会话关闭时需要清理该会话创建的所有临时节点,因此要小心临时节点由于会话关闭而导致数据丢失。