`
isiqi
  • 浏览: 16496201 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

【转帖】如何设计与优化高性能的HTTP接口型应用

阅读更多

【转帖】如何设计与优化高性能的HTTP接口型应用

【一个故障引发的话题】

最近,项目中的短信模块收到一个故障日志,要求我协助调查一下:

2010-05-07 09:22:07,221 [?:?] INFO httpclient.HttpMethodDirector - Retrying request
:org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(Unknown Source)
2010-05-07 09:22:07,223 [?:?] INFO httpclient.HttpMethodDirector - I/O exception (org.apache.commons.httpclient.NoHttpResponseException) caught when processing request: The server sms.comm.china.alibaba.com failed to respond
:org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(Unknown Source)

查阅了HttpClient官方的异常说明文档(http://hc.apache.org/httpclient-3.x/exception-handling.html),可以看到以下一段话:

In some circumstances, usually when under heavy load, the web server may be able to receive requests but unable to process them. A lack of sufficient resources like worker threads is a good example. This may cause the server to drop the connection to the client without giving any response. HttpClient throws NoHttpResponseException when it encounters such a condition. In most cases it is safe to retry a method that failed with NoHttpResponseException.

简单的说,此异常是由于服务器端过载而拒绝接受请求(不再响应)所致。

检查了客户端调用的代码(以下代码每隔20秒执行一次,每晚会定期执行约10次)

for (int i = 0; i < 100; i++) {
HttpClient httpClient = new HttpClient();

GetMethod getMethod = new GetMethod(url);
HttpClientParams params = new HttpClientParams();
params.setConnectionManagerTimeout(120000); //设置120秒的客户端连接超时
params.setParameter(HttpMethodParams.RETRY_HANDLER,newDefaultHttpMethodRetryHandler()); //缺省重试3次
getMethod.setParams(params);

.....
}

老外有一篇文章,很好的描述了类似代码的性能隐患:《HttpClient容易忽视的细节——连接关闭》

1、英文原文http://www.codeweblog.com/httpclient-s-easy-to-overlook-the-details-the-connection-is-closed/

2、中文翻译http://www.javaeye.com/topic/234759

总述:实现一个HTTP接口不是件困难的事情,但是如何让这样的HTTP接口在高压力下(短时间内大数据量)也有稳定良好的表现,则不仅仅是HTTP服务器端需要做好设计与优化,而且HTTP客户端方面也同样需要非常谨慎与注意一些代码细节。否则,很有可能因(双方或单方)代码或配置中存在性能隐患,在软硬件环境的配合下就会出现一些“灵异”故障。

【HTTP协议知识】

为便于读者理解后文,先简述一些与HTTP性能密切相关的、又常常被工程师们所不深究的HTTP协议基础知识。

一、什么是HTTP KeepAlive

HTTP KeepAlive是就是通常所称的长连接。KeepAlive即服务器端为同一客户端保持连接一段时间(不立即关闭),以便于更多来自于此客户端的后续请求不断的利用此连接直至连接超时。

在HTTP1.0和HTTP1.1协议中都有对KeepAlive的支持。其中HTTP1.0需要在request header中增加”Connection: keep-alive“ 才能够支持,而HTTP1.1默认支持。

KeepAlive的更多阐述:

1、next request是在完成before request的response被client接收的情况下才发出。因此需要在向client写完before request的response后才能触发。

2、HTTP协议是基于TCP协议的,故服务器端与客户端都有可能关闭连接。KeepAlive只是表明了服务器端面对连接的一种优化策略,而客户端也完全可以主动关闭之(不利用)。

二、KeepAlive的好处与坏处

KeepAlive带来的好处是可以减少HTTP连接的开销,提高性能。比如,同一页面中如有很多内嵌的图片、JS、CSS等请求,则可以利用此特新性,使用很少的连接数(一般是2个)更快的下载下来,使得网页更快的展示出来。

KeepAlive的坏处是:

如果有大量不同的客户端同时(或瞬间)请求服务器端,且每一个客户端的都长期占用连接(比如:不关闭且ConnectionTimeOut设置过长)或服务器端也不快速失效连接(KeepAliveTimeout参数设置过大)的话,可能会快速占满服务器连接资源,导致更多的请求被排队或被拒绝或服务器down掉。

总结:浏览器作为一种HTTP客户端,充分的、很好的利用了HTTP协议的KeepAlive,让我们的浏览更加快速;而我们自写的HTTP客户端程序在KeepAlive特性(服务器已开启)下,需要以高数据量访问一个HTTP接口的时候,每一次请求应当尽快关闭连接释放资源(重点推荐)或者在同一连接上适当多发几次请求(不推荐)。

【高性能应用的策略】

所以,当我们需要一个高性能的HTTP接口型应用时:

1、服务器端:关闭KeepAlive。

2、服务器端:最好直接支持HTTP协议(注意用POST,不要GET),而不是任何包装过的协议,比如:hessian/soap等。

3、服务器端:在一个请求中,最好设计成:支持多条指令批处理,以节省连接数。

4、服务器端:对请求的处理应当尽可能的快(如在150ms内),如不能同步返回执行结果则支持异步回调模式。

5、客户端:在代码中,同一个客户端实例中全部请求结束后应主动关闭连接(无须事先设置客户端的ConnectionTimeOut参数)。

6、客户端:如服务器未关闭KeepAlive,在同一个客户端实例中可以适量发出多个请求(总时间应稍小于服务器KeepAliveTimeout参数)。此方式需要精确操作,不推荐。

【一些优化细节】

在服务器端,我们一般选用的是Apache+Tomcat/JBoss的组合。关于JBoss的配置及优化可参看JBoss官网。

最主要的是关于Apache的优化,推荐阅读两篇文章:
1、Apache性能优化
http://www.aliwo.net:8080/2009/12/apache/

2、Apache中KeepAlive配置的合理使用http://www.net527.cn/a/caozuoxitong/Linux/5283.html

在客户端的Java代码中,我们最常使用的是HttpClient工具包。

有一些细节要注意:

1、在每一个HttpClient实例发完请求后,(如不再使用)应及时关闭连接。

最简单的方式是,在HTTP Request Header中发送(Connection: close),指示服务器关闭当前连接。

代码如下:

method.setRequestHeader("Connection", "close");

2、可以设计为单例模式:无需每次创建HttpClient实例,可多次发送请求(请求头设置见第一条)

分享到:
评论

相关推荐

    转帖性能测试.pdf

    通过可重复的、真实的测试能够彻底地度量应用的可扩展性和性能,确定问题所在以及优化系统性能。 性能测试是一个非常重要的软件测试过程,对于软件的质量保证和系统的性能优化都起着至关重要的作用。

    转帖经典---JAVA设计模式

    《转帖经典---JAVA设计模式》这本书或资料可能涵盖了这些模式的详细解释、示例代码以及如何在实际项目中应用这些模式。通过学习和理解这些设计模式,开发者能够更好地设计和重构软件,提升代码质量。

    论坛转帖工具.rar

    这类工具可能包括自动抓取、格式转换、内容优化等功能,以适应不同论坛的规则和格式要求。 描述中的“纯HTML”意味着该工具可能是基于HTML编写的,即它可能是一个网页应用或者简单的网页文件,用户只需通过浏览器...

    桥式转载机转弯装置研究与应用

    综上所述,这篇文章是关于煤矿中桥式转载机转弯装置的研究与应用,涵盖了煤矿生产效率的提升、设备设计优化、工业应用推广等多方面的知识点,同时展示了工程技术分析和仿真工具在现代煤矿设备中的重要作用。

    转帖:Android应用的自动升级、更新模块的实现docx.docx

    1. **版本检查接口**: 设计一个HTTP接口或提供一个版本信息文件,如`http://localhost/myapp/ver`,返回JSON或XML数据,包含远程版本的`versionCode`和`versionName`。 2. **发起请求**: 使用`HttpURLConnection`或...

    贴吧转帖工具

    【贴吧转帖工具】是一种专为百度贴吧用户设计的便捷工具,主要用于提高用户在贴吧中的互动效率。通过这款工具,用户可以实现一键转帖和一键8经验签到的功能,极大地简化了传统操作流程,节省了用户的时间,提升了...

    [转帖]世界编程大赛第一名写的程序

    标题和描述中的“世界编程大赛第一名写的程序”这一知识点,实际上指向了计算机科学与编程竞赛领域的一个重要概念:即在高水平的编程比赛中,优胜者所编写的代码往往蕴含着高级算法、数据结构以及编程技巧。...

    【转帖】Flex 开发入门

    ActionScript 3.0是Flex中最常使用的版本,它具有性能优化和类库支持,使得开发更加高效。 2. **MXML**: MXML 是Flex中的标记语言,用于描述用户界面的布局和组件。它可以与ActionScript混合使用,为开发者提供了...

    UBB论坛转帖圣手.exe

    UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe

    转帖工具插件 for PHPwind 7.5 正式版.rar

    "转帖工具插件 for PHPwind 7.5 正式版" 是专门为 PHPwind 7.5 版本设计的一个功能插件,旨在提供便捷的帖子转移功能,帮助管理员或者用户将内容从一个地方轻松移动到另一个地方,而无需直接编辑论坛的原始文件。...

    编辑人员转帖去水印工具

    在未经许可的情况下去除水印并分享内容可能会引起法律纠纷,因此在实际应用中,确保合法性和道德规范至关重要。 总之,编辑人员转帖去水印工具如Teorex Inpaint,为图像编辑提供了便利,通过其独特的算法和技术,...

    discuz X2转帖工具、采集工具

    X2转帖工具、采集工具”是针对这个平台设计的辅助软件,主要用于帮助论坛管理员或用户批量发布帖子和采集内容,提高论坛内容更新的效率。 一、批量发帖功能 1. 自动化发布:此工具可以自动化地创建和发布帖子,...

    转帖工具ConvertX fordiscuz7.1/7.2 修改增强版.rar

    1.修改自Convert X转帖工具 2.新增批量替换关键词(原来是单个词语替换,可以利用这个功能删除一些网站的防转帖代码) 3.批量随机新增文字(新增内容可自定义,从而实现伪原创) 4.cookie记录替换和新增关键词(避免每次...

    Proteus仿真实例——LPC2106的以太网仿真,包含源码(转帖)

    LPC2106是飞利浦(现恩智浦半导体)公司的一款基于ARM7TDMI内核的微控制器,具有丰富的外设接口和高性能特性,常用于嵌入式系统设计。 首先,Proteus是一款强大的电子设计自动化工具,它支持电路原理图设计、元器件...

    转帖几个网站Banner的FLA源文件

    7. **导出设置与优化**:FLA文件还展示了如何设置最终的导出选项,包括文件大小优化、播放速度控制和不同平台的兼容性调整。 总之,通过研究这10个网站Banner的FLA源文件,无论是初学者还是经验丰富的设计师,都...

    纺织CAD软件与《纺织CAD》课程教学.pdf

    纺织CAD软件是计算机辅助设计(Computer Aided Design)技术在纺织领域的应用,随着计算机硬件和软件技术的飞速发展,纺织CAD/CAM实用系统越来越成熟,对纺织行业产生了巨大的经济效益,并推动了对纺织品设计专业...

    DSP学习进阶[转帖] 很实用,大家分享.doc

    DSP5000系列的性能介于高与低之间,因此其开发难度适中,适合于进一步深化对DSP编程的理解和实践。 #### 三、DSP6000系列:高级探索 进入DSP6000系列的学习,标志着开发者已经迈入了高级阶段。这一系列的DSP不仅在...

    usb数据线定义[图].pdf

    USB(通用串行总线)是一种广泛应用于个人电脑和移动设备的标准接口技术。它的核心优势在于其通用性和便捷性,使得用户可以轻易地将各种外围设备(如鼠标、键盘、打印机、相机等)连接到计算机。USB接口通过一根数据...

    开心网网站设计分析.pdf

    网站提供了丰富的社交工具,包括日记、相册、动态记录、转帖和社交游戏,旨在帮助用户与亲友保持紧密联系。 1. **网站功能与实现方式** - **基础工具**:这些应用主要用于信息分享,如照片、日记、记录和转帖。...

Global site tag (gtag.js) - Google Analytics