[原创]Zookeeper相关的ConnectionLossException的解决办法

最近遇到了一个比较头疼的问题:有一个Java project中的test case在Jenkins自动nightly build的时候经常failed,有越来越频繁的趋势,但是如果在它failed之后到Jenkins上手工重新run,它有时又能成功(但还是有失败的,失败与成功的比例大概各占一半)。
而且在我的计算机(Ubuntu)上跑这个test case,它几乎从来不fail,但是在Jenkins服务器上跑,它就总是挂掉。
这种诡异的问题很恼人,经过Jenkins记下来的build log分析,觉得最有可能的原因是和Zookeeper有关,因为这个test case使用了Curator的TestingServer来模拟Zookeeper Server,而且这个test case中启动了很多的service并注册到了Curator模拟的Zookeeper Server上,而且在test case运行的过程中,还会有很多个client不断地连接到Zookeeper Server上,从中取出多个service的信息,并与它们交互,总而言之,test case的流程比较复杂。

test case failed的时候,有一个特点:运行时间特别长,甚至于需要60多秒才能完成,从log可见,Curator会retry多次,耗掉了比较多的时间。failed的关键日志如下:

[main-EventThread] ERROR c.n.c.f.imps.CuratorFrameworkImpl 416 - Background operation retry gave up org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss at org.apache.zookeeper.KeeperException.create(KeeperException.java:90) ~[zookeeper-3.3.1.jar:3.3.1-942149] at com.netflix.curator.framework.imps.CuratorFrameworkImpl.processBackgroundOperation(CuratorFrameworkImpl.java:380) ~[curator-framework-1.0.1.jar:na] 
at com.netflix.curator.framework.imps.BackgroundSyncImpl$1.processResult(BackgroundSyncImpl.java:49) [curator-framework-1.0.1.jar:na] 
at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:575)
......
就是这个时不时发生的ConnectionLossException,真把人折腾死。在解决过程中,我依次尝试了几种方法:
文章来源:http://www.codelast.com/
【1】修改test case中service的端口
一开始这样做是因为我怀疑test case fail与我启动的多个service的端口冲突有关。本来这些service使用的就是随机的端口号,为了让它们更不可能冲突,修改代码让它们分布在不同的范围内。
结果:无效,test case仍然fail。可见不是端口问题。

【2】升级jar包的版本
后来这样做是因为我找到了这个网页,里面有人提供了一个patch。由于我使用的Curator和Zookeeper的jar包版本都比较低,所以,如果是lib的bug造成的,那么我在上面耗那么多时间就太不值了,所以我要确保罪魁祸首不是它们。
因此我决定先更新一批jar包,看能否解决问题。
于是,我到Curator的主页上,想下载一个最新版,但是我个人觉得,其网页做得实在是太太太太...不人性化了,这是因为:首先,大多数类似的网站都有一个“Download”链接,这上面偏偏叫“Releases”,这不是故意给人造成麻烦吗?一点也不直观。
其次,你到“Releases”页面中,经过层层点击,最终下载了一个压缩包(例如apache-curator-2.2.0-incubating-source-release.zip)之后,解压开来,发现它需要Maven才能编译。好吧,哥没装这货...而且我当时的网速特别慢,Maven自动下载依赖包会要了我的命的(不知道会要多长时间)。我只是想要几个小小的jar包啊,放过我吧...
于是我再次回到Curator网站上,仔细看看它是否提供了jar包下载,睁大眼睛看到了下面的这句话:

Curator binaries are published to Maven Central. Curator consists of several artifacts. 
我终于明白了,我应该到Maven Central上去下载jar包啊!赶紧上去,分别搜索curator-framework、curator-client、curator-test,分别找到了最新版的这些jar包(2.2.0版),更新到Java project中。
文章来源:http://www.codelast.com/
【3】改程序
更新完jar包就万事顺利了?绝对没有。2.2.0版的Curator和1.x版有很大的不同,连package name都改了一堆啊!我靠,project一编译,一堆的error,看了都头晕。
好吧,我耐心地一个个改完,最后,本机上的的test case终于可以跑过了。
然后,就是放到Jenkins服务器上检验效果的时候了!整个project拷贝到Jenkins服务器上,运行ant test,经过并不漫长的等待之后,test case通过了。

文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤ 
转载需注明出处:codelast.com 
感谢关注我的微信公众号(微信扫一扫):

wechat qrcode of codelast

发表评论