APP下载

Tomcat 7下使用异步Servlet实践

2015-06-29李春玲

卷宗 2015年6期
关键词:线程逻辑解决方案

李春玲

摘 要:在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的使用,需要根据具体的场景和服务器能力设计来权衡使用。该解决方案非常适合于某些应用场景,比如说通知类、日志类服务等,他们的执行与请求/响应是解耦的。而对于需要等待数据库查询完成,或者需要明确获得本次处理结果,才能返回响应处理场景来说,这种方式就没有什么必须性了。

猜你喜欢

线程逻辑解决方案
刑事印证证明准确达成的逻辑反思
逻辑
解决方案和折中方案
创新的逻辑
简洁又轻松的Soundbar环绕声解决方案
浅谈linux多线程协作
4G LTE室内覆盖解决方案探讨
Moxa 802.11n WLAN解决方案AWK-1131A系列
基于上下文定界的Fork/Join并行性的并发程序可达性分析*
Linux线程实现技术研究