zk子节点过多时获取字节点报错.org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = Conn

当zk字节点过多时,通过client.getChildren().forPath("/path"); 获取子节点时报错。org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /path。

跟这代码捋了一下。发现最终问题是zk客户端默认数据传输大小为4M.而子节点太多了,导致数据大小超过该大小,

通过-Djute.maxbuffer = 10485760,设置大小为10M解决该问题。

 

大概的代码逻辑见下面大概几处:

org.apache.zookeeper.ClientCnxn.SendThread#run

zk子节点过多时获取字节点报错.org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = Conn_第1张图片

zk子节点过多时获取字节点报错.org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = Conn_第2张图片

zk子节点过多时获取字节点报错.org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = Conn_第3张图片

zk子节点过多时获取字节点报错.org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = Conn_第4张图片

zk子节点过多时获取字节点报错.org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = Conn_第5张图片

zk子节点过多时获取字节点报错.org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = Conn_第6张图片

zk子节点过多时获取字节点报错.org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = Conn_第7张图片

大概代码逻辑就是上面这样。

收到服务端的数据的length大于默认的1024 * 4096就是4M。抛出异常,在外面catch住,然后就走cleanup();的代码逻辑。对pendingQueue中的packet设置为ConnectionLoss异常。最终导致该异常。

 

这里zk的处理方式个人觉得有点不妥,抛出的异常容易误导用户。个人觉得自己定义一个专门的异常来处理可能会更好一点。

你可能感兴趣的:(分布式系统)