使用异步Servlet改进应用性能
作者:网络转载 发布时间:[ 2014/6/6 13:29:30 ] 推荐标签:性能测试 测试技术
Nikita Salnikov Tarnovski是plumbr的高级开发者,也是一位应用性能调优的专家,他拥有多年的性能调优经验。近日,Tarnovski撰文谈到了如何通过异步Servlet来改进常见的Java Web应用的性能问题。
众所周知,Servlet 3.0标准已经发布了很长一段时间,相较于之前的2.5版的标准,新标准增加了很多特性,比如说以注解形式配置Servlet、web.xml片段、异步处理支持、文件上传支持等。虽然说现在的很多Java Web项目并不会直接使用Servlet进行开发,而是通过如Spring MVC、Struts2等框架来实现,不过这些Java Web框架本质上还是基于传统的JSP与Servlet进行设计的,因此Servlet依然是基础、重要的标准和组件。在Servlet 3.0标准新增的诸多特性中,异步处理支持是令开发者为关注的一个特性,本文将详细对比传统的Servlet与异步Servlet在开发上、使用上、以及终实现上的差别,分析异步Servlet为何会提升Java Web应用的性能。
本文主要介绍的是能够解决现代Web应用常见性能问题的一种性能优化技术。当今的应用已经不仅仅是被动地等待浏览器来发起请求,而是由应用自身发起通信。典型的示例有聊天应用、拍卖系统等等,实际情况是大多数时间与浏览器的连接都是空闲的,等待着某个事件来触发。
这种类型的应用自身存在着一个问题,特别是在高负载的情况下问题会变得更为严重。典型的症状有线程饥饿、影响用户交互等等。根据近一段时间的经验,我认为可以通过一种相对比较简单的方案来解决这个问题。在Servlet API 3.0实现成为主流后,解决方案变得更加简单、标准化且优雅了。
在开始介绍解决方案前,我们应该更深入地理解问题的细节。还有什么比看源代码更直接的呢,下面来看看下面这段代码:
@WebServlet(urlPatterns = "/BlockingServlet")
public class BlockingServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
long start = System.currentTimeMillis();
Thread.sleep(2000);
String name = Thread.currentThread().getName();
long duration = System.currentTimeMillis() - start;
response.getWriter().printf("Thread %s completed the task in %d ms.", name, duration);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
|
上面这个Servlet主要完成以下事情:
请求到达,表示开始监控某些事件。
线程被阻塞,直到事件发生为止。
在接收到事件后,编辑响应然后将其发回给客户端。
为了简化,代码中将等待部分替换为一个Thread.sleep()调用。
现在,你可能会觉得这是一个挺不错的Servlet。在很多情况下,你的理解都是正确的,上述代码并没有什么问题,不过当应用的负载变大后不是这么回事了。
为了模拟负载,我通过JMeter创建了一个简单的测试,我会启动2,000个线程,每个线程运行10次,每次都会向/BlockedServlet这个地址发出请求。将这个Servlet部署在Tomcat 7.0.42中然后运行测试,得到如下结果:
平均响应时间:19,324ms
快响应时间:2,000ms
慢响应时间:21,869ms
吞吐量:97个请求/秒
默认的Tomcat配置有200个工作线程,此外再加上模拟的工作由2,000ms的睡眠时间来表示,这能比较好地解释快与慢的响应时间了,每个线程都会睡眠2秒钟。再加上上下文切换的代价,因此97个请求/秒的吞吐量基本上是符合我们的预期的。
对于绝大多数的应用来说,这个吞吐量还算是可以接受的。重点来看看慢的响应时间与平均响应时间,问题变得有些严重了。经过20秒而不是期待的2秒才能得到响应显然会让用户感到非常不爽。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11