1、会话概述

在ZooKeeper中,客户端和服务端建立连接后,会话随之建立,生成一个全局唯一的会话ID(Session ID)。服务器和客户端之间维持的是一个长连接,在SESSION_TIMEOUT时间内,服务器会确定客户端是否正常连接(客户端会定时向服务器发送heart_beat,服务器重置下次SESSION_TIMEOUT时间)。因此,在正常情况下,Session一直有效,并且ZK集群所有机器上都保存这个Session信息。在出现网络或其它问题情况下(例如客户端所连接的那台ZK机器挂了,或是其它原因的网络闪断),客户端与当前连接的那台服务器之间连接断了,这个时候客户端会主动在地址列表(实例化ZK对象的时候传入构造方法的那个参数connectString)中选择新的地址进行连接。

2、连接断开

好了,上面基本就是服务器与客户端之间维持会话的过程了。在这个过程中,用户可能会看到两类异常CONNECTIONLOSS(连接断开)和SESSIONEXPIRED(Session过期)。连接断开(CONNECTIONLOSS)一般发生在网络的闪断或是客户端所连接的服务器挂机的时候,这种情况下,ZooKeeper客户端自己会首先感知到这个异常,具体逻辑是在如下方法中触发的:一种场景是Server服务器挂了,这个时候,ZK客户端首选会捕获异常

所以,现在对于“连接断开”这个过程就一目了然了,核心流程如下: ZK客户端捕获“连接断开”异常 ——> 获取一个新的ZK地址 ——> 尝试连接
在这个流程中,我们可以发现,整个过程不需要开发者额外的程序介入,都是ZK客户端自己会进行的,并且,使用的会话ID都是同一个,所以结论就是:发生CONNECTIONLOSS的情况,应用不需要做什么事情,等待ZK客户端建立新的连接即可。

 3、会话超时

SESSIONEXPIRED发生在上面蓝色文字部分,这个通常是ZK客户端与服务器的连接断了,试图连接上新的ZK机器,但是这个过程如果耗时过长,超过了SESSION_TIMEOUT 后还没有成功连接上服务器,那么服务器认为这个Session已经结束了(服务器无法确认是因为其它异常原因还是客户端主动结束会话),由于在ZK中,很多数据和状态都是和会话绑定的,一旦会话失效,那么ZK就开始清除和这个会话有关的信息,包括这个会话创建的临时节点和注册的所有Watcher。在这之后,由于网络恢复后,客户端可能会重新连接上服务器,但是很不幸,服务器会告诉客户端一个异常:SESSIONEXPIRED(会话过期)。此时客户端的状态变成 CLOSED状态,应用要做的事情就是的看自己应用的复杂程序了,要重新实例zookeeper对象,然后重新操作所有临时数据(包括临时节点和注册Watcher),总之,会话超时在ZK使用过程中是真实存在的。

所以这里也简单总结下,一旦发生会话超时,那么存储在ZK上的所有临时数据与注册的订阅者都会被移除,此时需要重新创建一个ZooKeeper客户端实例,需要自己编码做一些额外的处理。

4、会话时间(Session Time)

在《ZooKeeper API 使用》一文中已经提到,在实例化一个ZK客户端的时候,需要设置一个会话的超时时间。这里需要注意的一点是,客户端并不是可以随意设置这个会话超时时间,在ZK服务器端对会话超时时间是有限制的,主要是minSessionTimeout和maxSessionTimeout这两个参数设置的。(详细查看这个文章《ZooKeeper管理员指南》)Session超时时间限制,如果客户端设置的超时时间不在这个范围,那么会被强制设置为最大或最小时间。 默认的Session超时时间是在2 * tickTime ~ 20 * tickTime。所以,如果应用对于这个会话超时时间有特殊的需求的话,一定要和ZK管理员沟通好,确认好服务端是否设置了对会话时间的限制。

zookeeper会话超时相关推荐

  1. ZooKeeper 会话超时

    1.会话概述 在ZooKeeper中,客户端和服务端建立连接后,会话随之建立,生成一个全局唯一的会话ID(Session ID).服务器和客户端之间维持的是一个长连接,在SESSION_TIMEOUT ...

  2. HMaster因zookeeper连接超时自杀

    缘由 hbase在上线一段时间后,发现HMaster经常会自杀挂掉,具体报错如下 报错 2019-06-14 11:24:07,242 WARN [master/ms-fibo-test-datase ...

  3. oracle会话超时,Oracle EBS控制会话时间及超时

    1. ICX:会话超时                            ICX:Session Timeout 定义系统保持一个非活动的用户会话的超时间隔.默认为1800000毫秒(30分钟). ...

  4. jsf标签p:ajax_JSF AJAX请求的会话超时处理

    jsf标签<p:ajax> JSF AJAX请求的会话超时处理 当我们使用AJAX行为开发JSF应用程序时,在处理Ajax请求的超时情况时,我们可能会遇到问题. 例如,如果您使用的是基于J ...

  5. Spring Java配置:会话超时

    当您可以使用基于Java的配置开发Spring应用程序时,我们生活在一个美好的时光. 不再有多余的XML代码,只有纯Java代码. 在本文中,我想讨论一个关于Spring应用程序中会话管理的热门话题. ...

  6. 如何在Play Framework 2中实现会话超时

    如果您遵循Play Framework 2指南以实施身份验证: http://www.playframework.com/doc-m-e-t-t-i o / n..2..2..2 / Jac agéi ...

  7. JSF AJAX请求的会话超时处理

    JSF AJAX请求的会话超时处理 当我们使用AJAX行为开发JSF应用程序时,在处理Ajax请求超时场景时可能会遇到问题. 例如,如果您使用的是基于J2EE表单的身份验证,则会话超时后应将正常请求重 ...

  8. hbase 查询设置超时_hbase master挂掉-zookeeper连接超时原因

    并行运行hbase删表,建表操作,多个表多个region,导致hbase挂掉.查看日志: 从日志中可以看出GC时间过长导致zookeeper连接超时,master退出.(是master退出而不是reg ...

  9. java redirect 超时_会话超时后,Spring安全性不会重定向到上次请求的页面登录

    首先启用并发会话控制支持是在以下位置添加以下侦听器web.xml: org.springframework.security.web.session.HttpSessionEventPublisher ...

  10. java和ajax超时_java – 如何在不重置tomcat的会话超时的情况下执行经过身份验证的AJAX请求?...

    我会使用Grails过滤器,它会执行类似于The-MeLLeR提议的内容,而不会在所有会话中进行不必要的循环: class AjaxTimeoutFilters { int sessionTimeou ...

最新文章

  1. linux下添加路由的方法
  2. Python-logging报错解决:UnicodeEncodeError: 'gbk' codec can't encode character '\u' in position: illegal
  3. Spring-AOP 使用@AspectJ
  4. java 三角依次递增在递减_java中用for循环怎样打印三角行啊,主要是不理解什么情况外层循环递增什么时候递减,如等腰三角形...
  5. sql 找到最近的值_数据分析——SQL查询(常用函数)
  6. Linq to SQL学习
  7. SendMessage函数的常用消息及其应用大全
  8. 普通筛法时间界的证明
  9. 鸿蒙系统开发资金,华为终于动手,将拿出超十亿资金,开发者们有福了
  10. 将误删的Downloads文件夹快速恢复教程
  11. nacos实现配置中心,对比config
  12. 【UE4】特效之 Particle System 详解(二)—— 特效池
  13. matlab半导体器件仿真,半导体软件 - 仿真模拟半导体器件的物理场
  14. 【UAV】串级 PID 控制原理及应用
  15. Controller中使用swagger注解的正确姿势
  16. Cocos2d-x 整理 SDK,易接流程(写给自己看的
  17. 中华石杉-- --分布式服务框架Dubbo的笔记
  18. 一、Docker 容器
  19. C++ 地图涂色问题 栈递归
  20. ZOJ 3939。规律题

热门文章

  1. C语言实现—学生成绩管理系统(Linux下运行)
  2. django-rest-framework-jwt的使用
  3. 欧几里得算法(辗转相除法)
  4. wpf中的默认右键菜单中的复制、粘贴、剪贴等没有本地化的解决方式
  5. unity3d协同不同设备的代码
  6. 【项目经验】EasyUI Tree
  7. CentOS安装中文包
  8. Linux基础知识--Linux分区
  9. jquery 的一款比较好的Menu
  10. 文件上传------c#