zookeeper系列(三):session

session的概念

  • client与server只建立一个session。session失效后,再次建立session。session不失效就一直用这个session。
  • 之后的任何请求,都关联这个session。
  • session过期后,会删除该session创建的所有临时节点。

作用

  • 临时节点的是生命周期
  • watcher通知机制
  • 与server通信的媒介

session本质上就是:一个tcp长连接。session标识了这个长连接。
在server看来,一个session就代表了一个client。

session存哪

  • client会存。每次请求依赖这个session。
  • server会存。并对这个session进行管理。session失效的判断,是由server决策的。

session的数据结构

属性 描述
sessionID 会话ID,唯一标识一个session,每次创建session的时候生成,全局唯一。生成策略:时间戳和机器ID,这二者的一系列位操作与操作,生成,保证唯一
TimeOut 会话超时时间。客户端在创建session时定义。server会根据这个时间判断是否过期
TickTime 下次会话超时时间。server在进行session定期扫描和管理的时候使用。约等于 当前时间+超时时间
isClosing 记录session是否已经被关闭。关闭后,收到该session的请求,直接不处理了

session激活

session的管理在server端。由sessionTracker负责。管理方式就是传说中的“分桶策略”。


分桶策略.png

session以时间戳为桶进行存储。横坐标就是时间戳。
每个session的 ExpirationTime 的计算公式

ExpirationTime_ = currentTime + SessionTimeout
ExpirationTime = (ExpirationTime_/ExpirationInterval + 1) * ExpirationInterval

ExpirationInterval就是session的tickTime的值。默认2000毫秒。

接着看上图,激活的过程,其实就是session在横坐标移动的过程。

激活的触发条件

  • 只要client向server发送请求(包括读写请求),就会触发一次会话激活。
  • 如果client发现在sessionTimeout / 3 时间内尚未向server发送任何请求,那么client就会主动发起一个ping请求。server收到client的ping请求后,触发激活。

激活的执行动作

  1. 检查会话是否已经被关闭。已经被关闭,不再继续执行。
  2. 计算该session新的超时时间ExpirationTime。
  3. 定位该会话超时时间的横坐标
  4. session迁移。session迁移就是把session存放的地方,从当前横坐标移动到新的横坐标中。

session保持连接

  1. client:创建会话,指定超时时间timeout
  2. client:经过t/3时间,未收到server的任何响应(a.自己没有请求server。b.请求了,server挂了)。则主动向server发送ping心跳。
  3. client:经过2t/3时间,未收到server的任何响应,会尝试连接其他server节点。
  4. server:经过t时间,没有收到client的任何请求,server判定session过期。这个经过t时间,不是起定时任务监控这个t时间,是server一直扫横坐标。
session保持连接.png

client重连其他server,要保证新的server能看到新的最新事务 >= 之前server看到的最新事务。所以client连接到新的server后,会先判断最新事务的zxid是否满足 client上记录的zxid <= server上最新的zxid。若不符合,则尝试连接到另一个server。

session清理

server会扫描“分桶策略”的横坐标。在当前时间之前的桶中的session,都是过期的session。未过期的session都已经激活到后面的时间中了。

在会话分桶策略中,zk将ExpirationInterval的倍数作为时间点来分布会话,因此,超时时间线程只要在这些指定的时间上进行检查即可,这样既提高了会话检查的效率,而且由于是批量清理,性能也非常好。

这就是“分桶策略”的优势,判断超时,并不是一个session一个session的扫。而是通过timeout让session不断的迁移,到超时时间未迁移的session,就是超时的session。

清理的过程

  1. 标记会话状态为“已关闭”
    session属性中isClosing属性标记为true

  2. 发起“会话关闭”请求
    session的关闭是client来做的。server通知client,把session关闭。

  3. 收集该session的临时节点

  4. 添加“节点删除”事务变更

  5. 将session从server中移除

  6. 关闭nio。tcp长连接。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354