当前位置:首页 > 开发 > 互联网 > 正文

ZK Timeout再讨论

发表于: 2012-10-18   作者:chenchao051   来源:转载   浏览:
摘要: http://crazyjvm.iteye.com/blog/1693757 文中提到相关超时问题,但是又出现了一个问题,我把min和max都设置成了180000,但是仍然出现了以下的异常信息: Client session timed out, have not heard from server in 154339ms for sessionid 0x13a3f7732340003

http://crazyjvm.iteye.com/blog/1693757 文中提到相关超时问题,但是又出现了一个问题,我把min和max都设置成了180000,但是仍然出现了以下的异常信息:

Client session timed out, have not heard from server in 154339ms for sessionid 0x13a3f7732340003 ...
Client session timed out, have not heard from server in 167805ms for sessionid 0x13a3f7732340000 ...

 

 

我们循着这个异常定位到:ClientCnxn.java

又看到zk存在如下信息:

Established session 0x13a3f773235011b with negotiated timeout 180000 for client /x.x.x.x:49702

这说明我们的配置的确起效果了。那为何还会超时呢,下面几段代码可能会解答这个问题:

异常信息在这里抛出:

if (to <= 0) {
    throw new SessionTimeoutException(
           "Client session timed out, have not heard from server in "
             + idleRecv + "ms"
             + " for sessionid 0x"
             + Long.toHexString(sessionId));
}

 而这段代码在:

 /**
     * This class services the outgoing request queue and generates the heart
     * beats. It also spawns the ReadThread.
     */
class SendThread extends Thread {
   //....
}

 我们可以看到这个类负责维护发信息并且维护心跳,接着往下看这个类中的关键代码,

readTimeout = negotiatedSessionTimeout * 2 / 3;  //我们设置了180s, 那这个值就是120s
connectTimeout = negotiatedSessionTimeout / serverAddrs.size();

 

 long now = System.currentTimeMillis();
        long lastHeard = now;
        long lastSend = now;
        while (zooKeeper.state.isAlive()) {
             try {
                    if (sockKey == null) {
                        // don't re-establish connection if we are closing
                        if (closing) {
                            break;
                        }
                        startConnect();
                        lastSend = now;
                        lastHeard = now;
                    }
                    int idleRecv = (int) (now - lastHeard);
                    int idleSend = (int) (now - lastSend);
                    int to = readTimeout - idleRecv;  //答案就在这行,readTimeout,上面提到120s
                    if (zooKeeper.state != States.CONNECTED) {
                        to = connectTimeout - idleRecv;
                    }
                    if (to <= 0) {
                        throw new SessionTimeoutException(
                                "Client session timed out, have not heard from server in "
                                + idleRecv + "ms"
                                + " for sessionid 0x"
                                + Long.toHexString(sessionId));
                    }
          

假如我没有分析错的话,那么就是这个原因了。

此外lease和rpc也会可能超时,这个等下次再简单结合代码具体谈。

ZK Timeout再讨论

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
原来只是一个小设定 官方文档 http://books.zkoss.org/wiki/ZK_Configuration_Reference/zk.xml/The
  从前天开始我们在论坛和“爱范消息”邮件列表上发放一些 Pinterest 的邀请码,出乎意料的是大家
JWFD工作流引擎设计--节点匹配搜索算法(再讨论) NMSA Node matching search algorithm--节点匹配搜索
JWFD工作流引擎设计--节点匹配搜索算法(再讨论) NMSA Node matching search algorithm--节点匹配搜
http://www.ikent.me/blog/ 按照google的逻辑,实际上他把共享做了细分:给自己的共享(add star和N
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器   
ZooKeeper: 分布式应用的分布式协调服务 ZooKeeper是一个分布式的,开源的分布式协调服务。它公开了
1.ZK 客户端和服务端之间的交互 官网对上图的解释如下: When a ZK application runs on the server,
1. ZK事件 zul代码如下 <window title="ZK Essentials" mode="overlapped" border="normal" width
ZK loader: responsible for loading pages and creating components according to user's request
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号