Chinaunix首页 | 论坛 | 博客
  • 博客访问: 952468
  • 博文数量: 99
  • 博客积分: 3306
  • 博客等级: 中校
  • 技术积分: 1238
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-21 10:14
文章分类

全部博文(99)

文章存档

2012年(37)

2011年(56)

2010年(6)

分类:

2012-11-16 15:16:15

原文地址:HAproxy Client KeepAlive 作者:cbin_07

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连接。

    c)Client收到Web Server的response中包含”Connection: keep-alive“,就认为是一个长连接,不close tcp连接。并用该tcp连接再发送request。(跳转到a))

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。


阅读(1794) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~