接口失败重试

接口失败重试机制

场景

最近这个项目用到了ES,因为物联网设备数据量很多嘛,如果使用关系型数据库的话查询瓶颈很快就会显现出来,众所周知ES是一个分布式查询引擎,查询效率刚刚的

问题来了,前一天晚上测试好了ES的查询接口,就是一个很简单的分页倒叙查询,结果第二天测试的时候出问题了,

1
2
3
4
5
6
Caused by: java.io.IOException: Connection reset by peer
at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:793)
at org.elasticsearch.client.RestClient.performRequest(RestClient.java:218)
at org.elasticsearch.client.RestClient.performRequest(RestClient.java:205)
at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1454)
at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1424)

一顿查询过后说是服务器关闭了ES的TCP连接导致的,这里就要说到TCP的保活机制了

TCP保活机制

保活机制是由一个保活计时器实现的,当计数器被激发,连接一段将发送一个保活探测报文,另一端接收报文的同时会发送一个ack作为响应。如果客户端无响应服务器将中断连接,否则会重置保活探测计时器。服务器端Linux有三个参数可以控制保活时间

1
2
3
tcp_keepalive_time (开启keepalive的闲置时长)
tcp_keepalive_intvlk (keepalive 侦测包的发送时间间隔)
tcp_keepalive_probes (如果对方不与应答,侦测包的发送次数)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!