1、背景
keepalive是就是通常所称的长连接。keepalive带来的好处是可以减少tcp连接的开销,这对于短response body的请求效果更加明显。同时,可以为采用http协议的交互式应用提供良好的session支持。
hapxoxy作为一款开源的loadbalance,其最新的1.3.22(stable版本)不能支持keepalive。(其中自从1.4.dev5开始也支持client端的keepalive)
2、keepalive的原理
在http1.0和http1.1协议中都有对keepalive的支持。其中http1.0需要在request中增加”connection: keep-alive“ header才能够支持,而http1.1默认支持。
http1.0 keepalive支持的数据交互流程如下:
a)client发出request,其中该request的http版本号为1.0。同是在request中包含一个header:”connection: keep-alive“。
b)web server收到request中的http协议为1.0及”connection: keep-alive“就认为是一个长连接请求,其将在response的header中也增加”connection: keep-alive“。同是不会关闭已建立的tcp连接。
c)client收到web server的response中包含”connection: keep-alive“,就认为是一个长连接,不close tcp连接。并用该tcp连接再发送request。(跳转到a))
http1.1 keepalive支持的数据交互流程如下:
a)client发出request,其中该request的http版本号为1.1。
b)web server收到request中的http协议为1.1就认为是一个长连接请求,其将在response的header中也增加”connection: keep-alive“。同是不会关闭已建立的tcp连接。
3、patch实现思路
haproxy client keepalive支持的patch主要解决三个问题:
a)”connection: keep-alive“ header处理问题
参见keepalive的原理,client keepalive对于这个header的处理是在对开启client keepalive的frontend上经过的response中增加”connection: keep-alive“ header;
b)怎么处理重新触发client发过来的request的时机问题
从keepalive的原理中可以得知,next request是在完成before request的response被client接收的情况下才发出。因此需要在向client写完before request的response后才能触发。而写完response可以通过计算response中body的长度信息得到(content-length或者chunk信息)
c)怎么触发not_first request
在haproxy中对于对于连接的管理是通过session这个数据结构来实现的。触发not_first request就通过重置session这个数据结构来实现。
4、patch的配置方式
配置方式为在每个proxy的front中配置添加:
option cli_keepalive
5、patch代码
附件为基于该版本的client keepalive patch。
该patch只支持client端的keepalive。