为什么要异步

Servlet 3.0中的一些主要提升点:

  • 异步支持
  • 容易配置
  • 可插拔性
  • 对已有API的改进

本文的目的是回答这个问题:为何要异步?
Web 2.0技术极大地改变了Web客户端和服务端之间的通信状况。Servlet 3.0中的异步支持被设计来应对这个新的挑战。为了让大家理解异步处理的重要性,让我们先来看看HTTP协议的演变。

  • HTTP协议的演变
    HTTP 1.0HTTP 1.1,最终的一个改变就是持久化连接(connection:keep-alive)。HTTP 1.0中,一个Web客户端和服务端之间的连接在单次request/response循环后就被关闭了。在HTTP 1.1中,连接为多次请求一直保持活跃并且被重用。持久连接明显降低了通信延迟,因为客户端不需要在每个请求之后重新建立TCP连接。

下面是三种场景,从中可以体会到为什么需要异步处理。

  • 每个连接一个线程(Thread per connection)
    对于提供商来说,怎样使Web服务器更加具有可扩展性是一个挑战。基于HTTP 1.1的持久连接,每个HTTP连接一个线程模型是提供商采用的一个普遍方法。对于这种策略,在客户端和服务端之间的每一个HTTP连接在服务端都会关联一个线程。线程从服务器管理的线程池中分配。一旦连接被关闭,关联的线程被回收到线程池并且准备服务其它任务。根据硬件配置,这种方式可以扩展到一个很大数量的并发连接。在主流Web服务器试验中得出的数据显示,内存消耗的增长比例与HTTP连接的数量成正比。原因是线程消耗内存相对较大。服务端配置一个固定大小的线程可能遭遇线程饥饿问题,而且一旦线程池里所有线程都被占有,新客户端的请求会被拒绝。
    另一方便,对于很多Web站点,用户仅是偶发性地从服务端请求页面。这是众所周知的page-by-page模型。连接线程在大多数时候都是空闲的,这浪费了大量资源。
  • 每个请求一个线程(Thread per connection)
    由于在Java 4的New I/O APIs中引入了非阻塞I/O能力,一个持久HTTP连接不要求一个线程一直分配给这个连接。仅当请求正在被处理时线程才能够被分配给连接。当一个连接在请求之间是空闲的,线程能够被回收,并且连接被放在一个集中NIO选择集合中来检测新的请求,而无需消耗一个单独的线程。这种模型称之为每个请求一个线程,这允许Web服务器使用一个固定数量的线程来处理不断增加的用户连接。在相同的硬件配置中,Web服务器在这种模型下比每个连接一个线程更具扩展性。当下流行的Web服务器,包括Tomcat、Jetty、GlassFish、WebLogic和WebSphere,它们都通过Java NIO使用每个请求一个线程模型。对于应用开发者而言,好消息是Web服务器以隐藏的方式实现了non-blocking I/O,没有通过servlet APIs暴露给任何应用。
  • 应对Ajax挑战
    为了用更加响应的接口来提供更好的用户体验,越来越多的Web应用使用Ajax。Ajax应用的用户与Web服务器交互比page-by-page模型更加频繁。不像普通的用户请求,Ajax请求能够被一个客户端频繁地发送给服务器。此外,客户端和运行在客户端的脚本能够定期轮训Web服务器来获取更新。更多的并发请求会引起更多线程被消耗,这抵消了thread-per-request方式带来的好处。
  • Slowing running,limited resources
    一些slow-running后端程序使这种状况更加糟糕。比如,一个请求能够被一个已经耗尽的JDBC连接池,或者一个低吞吐Web服务终端阻塞。长时间地挂起请求可能让线程被卡主,直到资源变为可用。更好的方式是把请求放到一个等待可用资源的中心队列中,并且回收那个线程。这有效地调整了请求线程的数量来匹配运行缓慢终端程序的能力。这也暗示了,在请求处理的某个点(当请求被存储在一个队列中),没有线程为了请求而被消耗。Servlet 3.0中的异步支持被设计通过一个通用和可移植的方法来实现这个方案,无论Ajax是否被使用。

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,182评论 11 349
  • 0 系列目录# WEB请求处理 WEB请求处理一:浏览器请求发起处理 WEB请求处理二:Nginx请求反向代理 本...
    七寸知架构阅读 13,881评论 22 190
  • 我的暗恋,源于一场无止境的尾随与一杯一杯珍珠奶茶的堆砌。 那个男生,很高,长相清秀,很瘦,但有两坨小肉挂在嘴边。 ...
    移动的喵阅读 378评论 0 1
  • 今天中午半天时间,去转卖了宽带,买了洗衣机,买了热水器。 原谅我天生放浪不羁爱折腾,又搬家了,想想毕业两年,从学校...
    茗昕阅读 1,174评论 0 0