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

当ZooKeeper的子节点数量过多时,使用client.getChildren()获取子节点会因数据传输大小超过默认限制而报错。本文介绍了解决这一问题的方法,即通过调整-Djute.maxbuffer参数增加数据传输大小。
摘要由CSDN通过智能技术生成

当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

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

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

 

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值