zookeeper的sessionId和超时分桶策略

开始

在阅读关于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散列到顺序的序号不断增长的桶里面,当时间越过这个桶代表的时刻时,即认为桶内所有的回话超时了。当然每次会话有新的交互都需要更新会话的桶。

其他

会话关闭时需要清理该会话创建的所有临时节点,因此要小心临时节点由于会话关闭而导致数据丢失。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文将从系统模型、序列化与协议、客户端工作原理、会话、服务端工作原理以及数据存储等方面来揭示ZooKeeper的技...
    端木轩阅读 3,849评论 0 42
  • 摘要 本节讲解会话,会话状态以及会话的创建,针对源码SessionTrackerImp进行展开,主要讲解 会话 客...
    赤子心_d709阅读 1,849评论 0 2
  • 在ZooKeeper客户端与服务端成功完成建立连接后,就建立了一个会话。ZooKeeper会话在整个运行期间的生命...
    微子Lee阅读 2,135评论 0 0
  • 今天是周一,但是早上却没有课,早早起床去了图书馆。刚刚出门就飘起小雨,然后就回去拿伞,走到半路已经变成瓢泼大雨,军...
    周兴哲阅读 244评论 0 1
  • 《小小的家》,山田洋次的作品,很喜欢日本老派的电影,常常是因为在最寻常的生活基底里人与人之间的情感如同小溪流...
    天明懒画眉阅读 300评论 0 1