一、背景session
KeepAlive是就是一般所稱的長鏈接。KeepAlive帶來的好處是能夠減小tcp鏈接的開銷,這對於短response body的請求效果更加明顯。同時,能夠爲採用HTTP協議的交互式應用提供良好的session支持。數據結構
HAPxoxy做爲一款開源的LoadBalance,其最新的1.3.22(Stable版本)不能支持KeepAlive。(其中自從1.4.dev5開始也支持Client端的KeepAlive) frontend
二、KeepAlive的原理tcp
在HTTP1.0和HTTP1.1協議中都有對KeepAlive的支持。其中HTTP1.0須要在request中增長」Connection: keep-alive「 header纔可以支持,而HTTP1.1默認支持。ide
HTTP1.0 KeepAlive支持的數據交互流程以下:it
a)Client發出request,其中該request的HTTP版本號爲1.0。同是在request中包含一個header:」Connection: keep-alive「。io
b)Web Server收到request中的HTTP協議爲1.0及」Connection: keep-alive「就認爲是一個長鏈接請求,其將在response的header中也增長」Connection: keep-alive「。同是不會關閉已創建的tcp鏈接。table
c)Client收到Web Server的response中包含」Connection: keep-alive「,就認爲是一個長鏈接,不close tcp鏈接。並用該tcp鏈接再發送request。(跳轉到a))class
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))
三、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這個數據結構來實現。
四、Patch的配置方式
配置方式爲在每一個Proxy的Front中配置添加:
option cli_keepalive
五、patch代碼
附件爲基於該版本的Client KeepAlive Patch。
該Patch只支持Client端的KeepAlive。