这两天在做JBOSS APACHE的集群环境,发现APACHE 分发到JBOSS node 上的请求,通过 AJP/1.3 协议端口,默认JBOSS为1090
现在知道,为了避免负载均衡服务器与WEB服务器之间的创建socket 连接开销,Apache 指定一套规范Apache JServ Protocol ,这个AJP 做了两个事情,第一把原ASCII传输转换成二进制传输,减少网络传输量。第二与WEB 容器 之间 保持连接,就是说,一旦连上了,没特殊情况不断,就像DB连接池一样,DB连接获取和释放是非常耗资源的,TCP/IP 三次握手也是一样的。自己的理解
以下是baike中的解释
AJP是Apache JServ Protocol 的缩写, 它是一种定向包协议, 用于将传入Web服务器的请求传递到处理,具体业务的应用服务器(通常是Servelet容器)。出于性能考虑,AJP使用二进制格式来传输可读性文本,将Web服务器通过TCP连接与Servlet容器联系。为了减少进程生成socket的开销,Web服务器和Servlet容器之间尝试保持持久性的TCP连接,对多个请求/回复循环重用一个连接。一旦连接分配给一个特定的请求,在请求处理循环结束之前不会再分配给其他请求。亦即,请求在一个连接上是独占的,这使连接两端的编码变得简洁,虽然这将导致同一时刻的连接数的增加。
一旦Web服务器打开了一个到Servlet容器的连接,连接处于以下的状态:
空闲
这个连接上没有处理的请求。
已分派
连接正在处理特定的请求。
一旦一个连接被分配给一个特定的请求,在连接上发送的基本请求信息将是高度压缩的。在此刻起,应用服务器准备开始处理请求。在处理过程中,,它能发回下面的信息给Web服务器:
SEND_HEADERS
发送一组头到浏览器。
SEND_BODY_CHUNK
发送一块主体数据到浏览器。
GET_BODY_CHUNK
从请求获得下一块数据。如果请求内容的包长度非常大或者长度不确定,这将是非常必要的。例如处理上传文件请求的情况。需要注意的是, 这和HTTP的块传输没有直接关联。
END_RESPONSE
结束请求处理循环。