在进行批量插入到clickhouse数据库的时候,出现了这种问题:

21:28:02.022 [pool-5-thread-9] INFO  o.a.http.impl.execchain.RetryExec - I/O exception (java.net.SocketException) caught when processing request to {}->http://35.26.59.191:8123: Broken pipe (Write failed)
21:28:02.029 [pool-5-thread-9] INFO  o.a.http.impl.execchain.RetryExec - Retrying request to {}->http://35.26.59.191:8123

原先是:断开的管道

18:34:50.032 [pool-11-thread-10] INFO  o.a.http.impl.execchain.RetryExec - I/O exception (java.net.SocketException) caught when processing request to {}->http://35.26.59.191:8123: >断开的管道
18:34:50.033 [pool-11-thread-10] INFO  o.a.http.impl.execchain.RetryExec - Retrying request to {}->http://35.26.59.191:8123

我还以为是连接时长过短的原因:(但是并没有用)

clickhouse.socketTimeout=6000000

后面查阅了相关资料才发现,HttpClient有默认的重试策略。

对于我们的场景应用中的get与post,可以总结为:

只有发生IOExecetion时才会发生重试InterruptedIOException、UnknownHostException、ConnectException、SSLException,发生这4中异常不重试get方法可以重试3次,post方法在socket对应的输出流没有被write并flush成功时可以重试3次。首先分析下不重试的异常:

InterruptedIOException,线程中断异常UnknownHostException,找不到对应hostConnectException,找到了host但是建立连接失败。SSLException,https认证异常另外,我们还经常会提到两种超时,连接超时与读超时:

java.net.SocketTimeoutException: Read timed outjava.net.SocketTimeoutException: connect timed out这两种超时都是SocketTimeoutException,继承自InterruptedIOException,属于上面的第1种线程中断异常,不会进行重试。

由于SocketException extends IOException,所以会尝试重试

总结1.只有发生IOExecetion时才会发生重试2.InterruptedIOException、UnknownHostException、ConnectException、SSLException,发生这4中异常不重试3.get方法可以重试3次,post方法在socket对应的输出流没有被write并flush成功时可以重试3次。4.读/写超时不进行重试5.socket传输中被重置或关闭会进行重试6.以及一些其他的IOException,暂时分析不出来。

参考:https://blog.csdn.net/weixin_34128534/article/details/86807209

08-01 21:30