Tomcat 7下使用异步Servlet实践
作者:李春玲 字数:1638 点击:
摘 要:在Servlet 3.0标准新增的诸多特性中,异步处理支持是最为关注的一个特性,本文将详细对比传统的Servlet与异步Servlet的差别,通过实践分析异步Servlet在何种场景下会提升Java Web应用的性能。
关键词:ervlet 3.0;异步
1 引言
Servlet3.0是Tomcat7出现的新特性,,而异步处理是servlet 3.0的最重要的特征。
在Servlet 3.0之前,通过Servlet执行比较耗时的任务时,Servlet线程会被阻塞,直到所有的处理完成后才能得到响应。如果服务器的请求链接很多,它将达到最大Servlet线程限制,后续的请求被拒绝出现连接错误。虽然这种同步问题可以用特定的方案解决,比如Tomcat 的 Comet、WebLogic 的FutureResponseServlet 和 WebSphere的Asynchronous Request Dispatcher。这种特定容器的解决方案的问题在于,在不改变应用程序代码时不能移动到其他Servlet容器。
而Servlet3.0提供标准的方式异步处理Servlet的同时增加异步Servlet支持。这样在Servlet API 3.0实现成为主流后,解决方案就变得更加简单、标准化且优雅。
2 异步Servlet实践
2.1 异步Servlet实现
本实践在Tomcat 7.0,JDK1.7环境下,基于eclipse 3.7集成开发环境下来搭建实践工程。
(1)配置
配置Tomcat采用Servlet3.0,有两种配置方式:一种是注解式,一种是修改web.xml配置,我们采用了注解式。
(2)异步Servlet实现流程
启动一个异步的Servlet处理过程,映射为异步上下文对象;
对这个上下文对象加入一个监听;
设置一个超时时间,终止异步过程;
创建执行业务逻辑的工作线程池;
将异步上下文放入线程池执行业务逻辑。
2.2 异步Servlet测试
实践采用Apache的JMeter测试工具,对项目中使用异步Servlet方式的的并发请求处理能力进行测试,同时与原有Servlet方式进行对比分析。
在相同测试服务和模型情况下,两种方式测试的统计结果如下:
原Servlet:
异步Servlet:
从以上结果可以看出,异步Servlet平均性能有一点提升,但提升不大,即整体性能受限于请求/响应的完整处理时间,跟是否采用异步方式无关。但偏离数据大幅度缩小,表明采用异步Servlet后,服务器的线程调度能力得到很大改善,响应处理能力加强。
3 测试结果分析
(1)经过对比分析,可以确认Tomcat对于Servlet当前请求的处理,不论是否采用Servlet3.0写法,都是一个请求对应一个响应,标准的协议处理模式。
(2)从并发的角度看,Servlet3.0的异步处理能力,不是针对同一个用户提交的请求,而是针对大量用户请求提交到服务端后的处理效果。其核心就是Servlet对象能够快速返回,接收其他用户连接上的请求,从而减少Servlet对象的创建/销毁在性能上的开销,避免因对象过多造成达到Servlet最大线程限制而可能的拒绝服务。在同样大数量并发请求场景下,异步Servlet对服务器稳定以及处理性能提升很有帮助。
(3)当业务逻辑处理的返回值跟本次请求所需要的返回值不相关,即可以立即返回响应而不需等待业务逻辑处理结果时,用Servlet3.0则将对整个处理性能有一个质的飞跃。
4 实践总结
通过实践分析,对于Servlet3.0的使用,需要根据具体的场景和服务器能力设计来权衡使用。该解决方案非常适合于某些应用场景,比如说通知类、日志类服务等,他们的执行与请求/响应是解耦的。而对于需要等待数据库查询完成,或者需要明确获得本次处理结果,才能返回响应处理场景来说,这种方式就没有什么必须性了。