Posted on 2008-08-12 14:29
英雄 阅读(5280)
评论(0) 编辑 收藏
httpclient的默认配置提供了最大的可靠性和标准的遵守,而不是性能。(哪个标准?难道是指HTTP协议规范?)有几个配置选项和优化技术,可以显着提高httpclient 的性能表现。 本文档给出了对httpclient如何调优的大纲。
1.重用HTTPCLIENT实例。
一般说来,建议一个通讯组件,甚至说一个应用软件就始终维持一个HttpClient对象实例存在。但是如果你的应用很稀罕才用到它,而且还不允许这么一个实例一直存在,那么,这里强烈建议,每次在disposing 它之前,一定要显式地shut down 它的 multithreaded connection manager 。这样做是确保连接池里的connection得到释放。
2.持续连接不关闭。
httpclient总是尽量重用连接。它不要求任何配置,默认情况下就是这样。某些情况下,这可能导致连接泄漏,而耗尽资源。禁用持续连接最简单的方法是提供或扩展一个connection manager,在releaseConnection被调用的时候,这个connection manager将把connection真正关闭掉。
3.http method的并发执行。(实际上是在对1.延伸)
如果应用程序逻辑允许并发执行多个HTTP请求,(例如对多个服务器的多个并发请求,或对同一个服务器代表不同用户身份的多个请求) ,应用程序可以为每一个HTTP session开启一个专门的线程,这样的设计自然将带来显著的性能提升。 而当使用一个线程安全的连接管理器,如multithreadedhttpconnectionmanager时,HttpClient能保证线程安全。这样,多个线程可以共享这么一个线程安全的HttpClient实例。请注意,应用程序的每个各自执行的线程必须使用各自的httpmethod实例;并且可配置各自的httpstate实例和/或hostconfiguration实例(代表一个特定的会话状态和主机配置)。这个共享的HttpClient和其标配的multithreadedhttpconnectionmanager将为各线程带来最高的性能。
4.request/response entity 流技术处理
HttpClient能够有效地流处理request,response。就是说大的entity可以不用在内存(泛滥)缓存就发送或接收。这点在多请求并发时尤其关键。虽然提供了方法可以通过访问字符串或字节组的方式处理数据(而不是通过流),但是不建议这样做。因为除非特别仔细,这样做很容易引起内存溢出,因为这些方法实际上是把整个entity都缓存在了内存中。
response流API:建议使用HttpMethod#getResponseBodyAsStream,将response体作为字节/字符流处理;不建议使用HttpMethod#getResponseBody 和HttpMethod#getResponseBodyAsString 。
request流API:对于request的流处理,技术难题在于如果通讯过程出现问题(认证失败或io失败),那么需要对发送的request entity进行重新获取,重新发送。很明显,(request的数据来源于应用程序的各个方面),除了可以提供API(NameValuePair 形式)处理可完全缓存在内存的数据(字节组等),不容易提供统一的API。因此(对于大块的entity),程序员可通过自行继承RequestEntity,在相应回调方法里进行流化处理。
5.Expect-continue handshake
HTTP提供HTTP 100 (Continue) 状态,是指客户端发送一个“预期HTTP100”的请求header,如果服务器响应100说明接受该客户端请求,则客户端继续发送body。是啊,如果服务器通过header就能判断是否响应100还是拒绝,那么不通过这条路就直接发送body(尤其是大body)真的太浪费资源了。授权拒绝是最典型的情形了。因此强烈建议对于那些有HTTP认证要求的服务器使用“预期HTTP100”这种通讯方式。注意如果通讯要通过代理,程序员要处理可能的警告,因为一些老的HTTP1.0代理服务器不能正确处理“预期HTTP100”通讯方式。
6. 钝态连接的检查
HTTP协议规范允许客户端或服务器端不知会对方,在任意时刻都可以终止一个连接(指底层网络连接),因此这个connection就变成了钝态或者说陈旧了,反正是不能用了。在默认情况下,HttpClient 会在执行HTTP方法前检查要用的连接,看看是否是钝态。这个检查需耗时15-30ms,根据使用的jre不同而不同。关闭这个检查能带来小部分的性能提升,尤其对于小负载response这种通讯。但是关闭后可能面临底层连接已关闭的异常(服务器主动关闭但没通知客户端)。
7.Cookie 处理
如果一个应用程序,例如web spider,不需要和服务器保持会话状态,则禁用cookie会带来轻微的性能提升。