keepalive timeout

下午遇到的一个问题。访问一个运行在marathon上服务偶尔会出现NoHttpResponseException,这是个java apache http client的异常。

marathon运行在mesos之上,服务发现是marathon-lb提供的。负载均衡使用的haproxy。

用python和curl都不能重现这个问题。

最后找到的问题症结如下:

1)能重现的只有java client。因为默认使用了连接池:PoolingHttpClientConnectionManager 。连接会使用Connection: keep-alive,在一段时间内会重用连接。4.4以后不会再每次复用连接的时候去检查连接isOpen()。只是在一定时间之后,默认5s。

2)tomcat server默认也是开启keep-alive的,而且默认的timeout等于connectionTimeout。20s(或者60s)配置在这里

3)中间的haproxy默认的keep-alive时间是1s

客户端发送一个请求,sleep 1s,立刻发送第二个请求,就会出现NoHttpResponse错误。sleep的时间太短或者太长,就不能重现。

因为client idel 1s的时候,haproxy就把连接断掉了。client再复用这个连接就出现错误了,server压根就不会收到这个请求。google发现,处理这个问题的通常做法就是retry一下。

果然发现http client builder可以设置一个retry handler,使用这个默认的,DefaultHttpRequestRetryHandler ,会对除了几个特定的异常外的IOException进行尝试,默认也只有幂等的http methods。详细的方法可以看文档。

解决的方法有几种,

1)在client端retry

2)haproxy的keep alive调长,5s以上。5s客户端就会自动检查了

但第二种,要看看会对haproxy造成多大的负担。

另外,ha除了http-keep-alive以外,还有几种模式,例如,http-server-close/forceclose/httpclose/http-tunel,是一个级别的,需要再读读文档看一下。

时间: 2024-10-04 00:04:13

keepalive timeout的相关文章

keep-alive详解

我们都知道,HTTP协议采用"请求-应答"模式,当使用普通模式,即非Keep-alive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议):当使用Keep-alive模式时(又称持久连接,连接重用)时,Keep-alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后续请求时,Keep-alive避免了重新建立连接. 在老的HTTP版本中,每个请求都将被创建一个新的客户端到服务器端的连接,在这个连接上发送请求,然后接受请求.

HTTP Keep-Alive详解

HTTP是一个请求<->响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个信息.在老的HTTP版本中,每个请求都将被创建一个新的客户端->服务器的连接,在这个连接上发送请求,然后接收请求.这样的模式有一个很大的优点就是,它很简单,很容易理解和编程实现:它也有一个很大的缺点就是,它效率很低,因此Keep-Alive被提出用来解决效率低的问题. Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新

HTTP Keep-Alive的作用

作用:Keep-Alive:使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接.Web服务器,基本上都支持HTTP Keep-Alive. 缺点:对于提供静态内容的网站来说,这个功能通常很有用.但是,对于负担较重的网站来说,虽然为客户保留打开的连 接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源仍旧被占用.当Web服务器和应用服务器在同一台机器上运行时,Keep- Alive功能对资源利用的影响尤其突出. 解

keep-alive

1.什么是Keep-Alive模式? 我们知道HTTP协议采用"请求-应答"模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议):当使用Keep-Alive模式(又称持久连接.连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接. 持久连接的引入解决了多对已请求服务器导致的socket连接低效性的

关于nginx keep-alive 参数的验证和心得

用chrome连接nginx服务器(nginx+spero),发现每次请求结果返回给浏览器后,会过一会才会运行 ngx_http_close_connection函数,可以看到nginx返回给chrome的header和结果是: HTTP/1.1 200 OK Server: nginx Date: Fri, 15 Apr 2016 08:39:50 GMT Content-Type: text/plain Content-Length: 28 Connection: keep-alive Ke

squid client长连接,怎么忽略keep-alive头部?

我使用squid做正向代理,也就是 client --> squid --> server.         由于server会返回头keep-alive: timeout=8,导致我的client的长连接在8秒后就会断开.         现在我想让client到squid的长连接固定在2分钟,不受server的keep-alive: timeout=8控制,请问我该怎么做? 谢谢.

HTTP协议Keep-Alive详解及问题

1.http的基础知识 http是一个请求--响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器响应这个信息. 在老的http版本中: 每一个请求都创建一个TCP连接,当一次请求被响应后,tcp四次挥手,连接断开. 这个模式的优点: 简单,易实现,易理解,且满足无连接的特点. 这个模式的缺点: 效率低. HTTP /1.0 在这个版本的协议上,如果客户端浏览器支持Keep-Alive,那么就在HTTP请求头部添加一个Connection:Keep-Alive,当服务器收到附带Conne

HTTP Keep-Alive详解[转]

HTTP是一个请求<->响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个信息.在老的HTTP版本中,每个请求都将被创建一个新的客户端->服务器的连接,在这个连接上发送请求,然后接收请求.这样的模式有一个很大的优点就是,它很简单,很容易理解和编程实现:它也有一个很大的缺点就是,它效率很低,因此Keep-Alive被提出用来解决效率低的问题. Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新

HTTP Keep-Alive

HTTP是一个请求<->响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个信息.在老的HTTP版本中,每个请求都将被创建一个新的客户端->服务器的连接,在这个连接上发送请求,然后接收请求.这样的模式有一个很大的优点就是,它很简单,很容易理解和编程实现:它也有一个很大的缺点就是,它效率很低,因此Keep-Alive被提出用来解决效率低的问题. Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新