应用服务器与zk之间的连接超时

关于connectString服务器地址配置

格式: 192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181
这个地址配置有多个ip:port之间逗号分隔,底层操作

ConnectStringParser connectStringParser =  new ConnectStringParser(“192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181”);

解释:
这个类主要就是解析传入地址列表字符串,将其它保存在一个ArrayList中
ArrayList serverAddresses = new ArrayList();
接下去,这个地址列表会被进一步封装成StaticHostProvider对象,并且在运行过程中,一直是这个对象来维护整个地址列表。
ZK客户端将所有Server保存在一个List中,然后随机打乱(这个随机过程是一次性的),并且形成一个环,具体使用的时候,从0号位开始一个一个使用。
因此,Server地址能够重复配置,这样能够弥补客户端无法设置Server权重的缺陷,但是也会加大风险。

客户端和服务端会话说明

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

会话时间

客户端并不是可以随意设置这个会话超时时间,在ZK服务器端对会话超时时间是有限制的,主要是minSessionTimeout和maxSessionTimeout这两个参数设置的。
如果客户端设置的超时时间不在这个范围,那么会被强制设置为最大或最小时间。 默认的Session超时时间是在2 * tickTime ~ 20 * tickTime
@param connectString Zookeeper服务地址
@param sessionTimeout Zookeeper连接超时时间

很多同学可能有这样的疑问,我明明把连接zk客户端的超时时间sessionTimeout设置为180秒了,可是为什么仅仅过了40几秒就超时了?

其实只这么设置,根本没有任何作用,因为客户端将sessionTimeout的值传给zk时,zk还会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值

public int getMinSessionTimeout() {  
    return minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout;  
}  


public int getMaxSessionTimeout() {  
    return maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout;  
}  

就是说这两个值,默认分别为tickTime 的2倍和20倍,而tickTime的默认值是3秒,即最后生效的超时时间,一定是6s

int minSessionTimeout = zk.getMinSessionTimeout();  
if (sessionTimeout < minSessionTimeout) {  
    sessionTimeout = minSessionTimeout;  
}  
int maxSessionTimeout = zk.getMaxSessionTimeout();  
if (sessionTimeout > maxSessionTimeout) {  
    sessionTimeout = maxSessionTimeout;  
}  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值