由异步servlet所想

转载 2012年03月29日 14:06:08
 
 
我们一直在用程序模拟现实世界的规则,但是有些很常见的规则,当我们引入到计算机中后,确并不一定适用。因为这个虚拟世界的构建规则跟现实世界是有差异的。特别是当我们还在跟硬件,性能做抗争的时候,现实世界的优秀法则往往并不能完全的映射到这个虚拟世界中。

一个简单的例子。当我们去面包店买面包的时候一般过程是这样的,
1.我对店员说:“你好,我要买面包。”
2.店员听到后说:“请稍等...”然后店员去厨房取面包,我在面包店等待...
3.店员拿出面包交给我,我付钱。买面包完成。

这里一共有三个步骤:1.我发出买面包请求。2.店员接受处理我的请求,我等待。3.店员完成请求,返回给我面包。
事情的处理过程很好,规则简单而适用。于是我们的计算机也模拟这个过程,实现了web的请求/应答模式:1.浏览器向web服务器请求资源。2.服务器响应请求,查找资源。3.服务器返回资源,请求完成。

但是仔细看看我们就能发现这个模式的问题:在步骤2店员拿面包的时候我什么都没做!我在等待!在店员拿面包够快的话这样也没什么大问题,我等半分钟,也没浪费多少时间。但是如果面包还在烤炉里,我等了十分钟店员才从厨房出来!那我可要发火了!同步servlet正是这样处理请求的。(注意这里要把servlet当买面包的人而不是把浏览器。)

于是我们开始找解决办法:
1.我等了5分钟,店员如果没出来,我就不买了。到计算机里,就是常见的请求超时处理了。浏览器在访问一个不存在的站点的时候,就会尝试连接一段时间,然后打开错误界面:Internet Explorer 无法显示该网页。
2.店员出来告诉我,面包还在烤,问我愿意等吗?这种处理过程计算机也有使用。3.我在步骤1的时候对店员说:“你好,我要买面包。麻烦面包好了打电话给我,我来取。”在计算机里这确是最棒的解决方案!也就是异步servlet的处理方式:

首先,Servlet接收到请求之后,将请求转交给一个异步线程来执行业务处理,Servlet线程本身返回至容器,异步线程处理完业务以后,可以直接生成响应数据,或者将请求继续转发给其它Servlet。如此一来,Servlet线程不再是一直处于阻塞状态以等待业务逻辑的处理,而是启动异步线程之后可以立即返回。

但是不要因此而以为异步servlet应该取代所有的同步servlet!

当我们把请求交给异步线程来执行业务处理,让Servlet线程本身返回至容器,其实是释放了一个线程,也创建了一个线程,结果是1+1-1=1,还是需要一个线程来为我们服务。资源一点也没节省,处理却更复杂了!那么异步servlet的用途究竟在哪呢?

目前我知道的适用异步servlet的一种情况,就是当我们想实现一种服务器主动与客户端(浏览器)通信的机制(comet)的时候,异步servlet能在这种机制中帮我们极大的节省线程资源。还有一种可能被应用的场景就是对数据库的访问时,但是要实现异步访问数据库,对整个应用的编程模式都会有很大影响!

虽然异步servlet没有那么高的期望值,但我觉得异步处理这种机制本身确是应该大放光彩的!适用场景也非常多:
Ajax,我们发送异步请求来防止程序阻塞。其实异步请求可以完全替代同步请求!
JMS,消息服务最诱人的地方就在与对异步的支持吧。
NIO,事件触发机制其实也有异步请求的影子。

我觉得任何的请求/应答模式都应该优先考虑异步请求的方式实现。异步请求是高效而灵活的。只是你可能需要点时间适应callBack的编程模式。

异步处理Servlet接收到的请求

在Servlet组件接收到的每个请求都会产生一个线程来处理请求并返回响应,当客户端的请求处理是一项比较耗时的过程,当有大量用户请求此Servlet时,Web容器中就会产生大量的线程,导致Web容器性能...
  • yanglun1
  • yanglun1
  • 2015年06月11日 13:32
  • 4627

使用异步servlet提升性能

本文针对当今 webapp 中一种常碰到的问题,介绍相应的性能优化解决方案。如今的WEB程序不再只是被动地等待浏览器的请求, 他们之间也会互相进行通信。 典型的场景包括 在线聊天, 实时拍卖等 —— ...
  • renfufei
  • renfufei
  • 2016年12月08日 00:03
  • 4117

Servlet中的异步处理

Servlet 3引入一项新的特性,可以让Servlet异步处理请求,本文来介绍这新技术 一.概述 WebServlet  和 WebFilter  注解类型可以包含  asyncSupp...
  • JavaLixy
  • JavaLixy
  • 2017年04月13日 21:47
  • 12872

Spring-MVC异步请求之Servlet异步

在Servlet3.0的规范中新增了对异步请求的支持,SpringMVC又在此基础上对异步请求提供了方便。异步请求是在处理比较耗时的业务时先将request返回,然后另起线程处理耗时的业务,处理完后在...
  • li563868273
  • li563868273
  • 2016年03月27日 16:52
  • 3323

并发(十四):异步Servlet与AJAX的区别与联系

在wEB应用程序的开发中,前端可以通过AJAX提供异步操作解决用户请求阻塞的问题,从而解决界面响应速度较慢的问题,既然如此,为何我们还需要后端的异步Servlet呢,这两个功能是否存在重复设计?其实对...
  • yiifaa
  • yiifaa
  • 2017年08月03日 18:25
  • 246

Ajax 异步处理 servlet 交互

首先 我要说   very 简单  两个事儿 1、
  • u010310183
  • u010310183
  • 2014年07月26日 15:54
  • 819

tomcat源码解析(五)--两种配置与异步servlet

常用的web基本都是用xml配置的,而在tomcat解析web.xml的过程中知道,如果类实现了ServletContainerInitializer接口的话,就可以不用在xml里面配置了. 现在对...
  • x87648510
  • x87648510
  • 2016年07月13日 22:02
  • 633

Servlet异步处理特性分析与实践

众所周知,Servlet 3.0标准已经发布了很长一段时间,相较于之前的2.5版的标准,新标准增加了很多特性,比如说以注解形式配置Servlet、web.xml片段、异步处理支持、文件上传支持等。虽然...
  • fuzhongmin05
  • fuzhongmin05
  • 2017年06月20日 20:47
  • 470

Tomcat怎么实现异步Servlet

有时Servlet在生成响应报文前必须等待某些耗时的操作,比如在等待一个可用的JDBC连接或等待一个远程Web服务的响应。对于这种情况servlet规范中定义了异步处理方式,由于Servlet中等待阻...
  • wangyangzhizhou
  • wangyangzhizhou
  • 2016年11月17日 22:39
  • 6473

如何使用 servlet3.x的 async 异步处理功能

在tomcat 7及其以后,它使用了servlet3.0/3.1。而servlet3.0/3.1一个很重要的新功能就是它的异步处理能力。 本文就这个新功能给出一个简单的使用例子,希望得到抛砖引玉的效果...
  • bigtree_3721
  • bigtree_3721
  • 2017年06月02日 16:40
  • 842
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:由异步servlet所想
举报原因:
原因补充:

(最多只允许输入30个字)