深入拆解Tomcat & Jetty
李号双
eBay技术主管
立即订阅
6067 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | Java程序员如何快速成长?
免费
模块一 必备基础 (4讲)
01 | Web容器学习路径
02 | HTTP协议必知必会
03 | 你应该知道的Servlet规范和Servlet容器
04 | 实战:纯手工打造和运行一个Servlet
模块二 整体架构 (9讲)
05 | Tomcat系统架构(上): 连接器是如何设计的?
06 | Tomcat系统架构(下):聊聊多层容器的设计
07 | Tomcat如何实现一键式启停?
08 | Tomcat的“高层们”都负责做什么?
09 | 比较:Jetty架构特点之Connector组件
10 | 比较:Jetty架构特点之Handler组件
11 | 总结:从Tomcat和Jetty中提炼组件化设计规范
12 | 实战:优化并提高Tomcat启动速度
13 | 热点问题答疑(1):如何学习源码?
模块三 连接器 (9讲)
14 | NioEndpoint组件:Tomcat如何实现非阻塞I/O?
15 | Nio2Endpoint组件:Tomcat如何实现异步I/O?
16 | AprEndpoint组件:Tomcat APR提高I/O性能的秘密
17 | Executor组件:Tomcat如何扩展Java线程池?
18 | 新特性:Tomcat如何支持WebSocket?
19 | 比较:Jetty的线程策略EatWhatYouKill
20 | 总结:Tomcat和Jetty中的对象池技术
21 | 总结:Tomcat和Jetty的高性能、高并发之道
22 | 热点问题答疑(2):内核如何阻塞与唤醒进程?
模块四 容器 (8讲)
23 | Host容器:Tomcat如何实现热部署和热加载?
24 | Context容器(上):Tomcat如何打破双亲委托机制?
25 | Context容器(中):Tomcat如何隔离Web应用?
26 | Context容器(下):Tomcat如何实现Servlet规范?
27 | 新特性:Tomcat如何支持异步Servlet?
28 | 新特性:Spring Boot如何使用内嵌式的Tomcat和Jetty?
29 | 比较:Jetty如何实现具有上下文信息的责任链?
30 | 热点问题答疑(3):Spring框架中的设计模式
模块五 通用组件 (4讲)
31 | Logger组件:Tomcat的日志框架及实战
32 | Manager组件:Tomcat的Session管理机制解析
33 | Cluster组件:Tomcat的集群通信原理
特别放送 | 如何持续保持对学习的兴趣?
模块六 性能优化 (8讲)
34 | JVM GC原理及调优的基本思路
35 | 如何监控Tomcat的性能?
36 | Tomcat I/O和线程池的并发调优
37 | Tomcat内存溢出的原因分析及调优
38 | Tomcat拒绝连接原因分析及网络优化
39 | Tomcat进程占用CPU过高怎么办?
40 | 谈谈Jetty性能调优的思路
41 | 热点问题答疑(4): Tomcat和Jetty有哪些不同?
结束语 (1讲)
结束语 | 静下心来,品味经典
深入拆解Tomcat & Jetty
登录|注册

27 | 新特性:Tomcat如何支持异步Servlet?

李号双 2019-07-11
通过专栏前面的学习我们知道,当一个新的请求到达时,Tomcat 和 Jetty 会从线程池里拿出一个线程来处理请求,这个线程会调用你的 Web 应用,Web 应用在处理请求的过程中,Tomcat 线程会一直阻塞,直到 Web 应用处理完毕才能再输出响应,最后 Tomcat 才回收这个线程。
我们来思考这样一个问题,假如你的 Web 应用需要较长的时间来处理请求(比如数据库查询或者等待下游的服务调用返回),那么 Tomcat 线程一直不回收,会占用系统资源,在极端情况下会导致“线程饥饿”,也就是说 Tomcat 和 Jetty 没有更多的线程来处理新的请求。
那该如何解决这个问题呢?方案是 Servlet 3.0 中引入的异步 Servlet。主要是在 Web 应用里启动一个单独的线程来执行这些比较耗时的请求,而 Tomcat 线程立即返回,不再等待 Web 应用将请求处理完,这样 Tomcat 线程可以立即被回收到线程池,用来响应其他请求,降低了系统的资源消耗,同时还能提高系统的吞吐量。
今天我们就来学习一下如何开发一个异步 Servlet,以及异步 Servlet 的工作原理,也就是 Tomcat 是如何支持异步 Servlet 的,让你彻底理解它的来龙去脉。

异步 Servlet 示例

取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入拆解Tomcat & Jetty 》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(13)

  • echo_陈
    我感觉,异步servlet只能说让tomcat有机会接受更多的请求,但并不能提升服务的并发吞吐量,因为如果业务操作本身还是慢的话,业务线程池仍然会被占满,后面提交的任务会等待。

    作者回复: 同意,还有就是业务处理一般阻塞在io等待上,越是IO密集型应用,越需要配置更多线程。

    2019-07-11
    2
    7
  • 梁中华
    异步sevlet内部的业务应用中的IO也需要异步IO支持吧,就像vertx的异步模式,否则都堵塞在业务线程上就没意义了

    作者回复: 说的对,所以Springboot webflux提供全异步的方案

    2019-07-12
    2
  • wfatec
    老师您好,我这里有一个疑惑,对于异步 servlet 来说,如果我在 filter 中执行 chain.doFilter() 之后,还需要执行 methodAfterChain() 方法,由于 servlet 是异步的,那么这个时候 methodAfterChain() 方法会等到这个异步 servlet 执行完 complete() 之后才执行,还是会立即执行呢?如果是立即执行,那么应该如何实现对返回结果的包装呢?如果不是立即执行,那原理是什么呢?
    2019-08-16
    1
  • 没有昵称
    感觉 异步 servlet 只是释放了一个连接器分配的线程,并没有立刻给web响应,在web上感受到的还是同步,老师 我的理解对吗
    2019-08-07
    1
  • Geek_ebda96
    老师,请问一个请求进来之后,如果采用异步servlet来处理,原来的请求tomcat线程被回收,那本身这个请求要再相应给客户端,怎么知道是哪个客户端请求过来的,是根据servlet力的request信息,获取客户端地址,相应给客户端吗?这个根你后面讲的complete有关系吗,具体是怎么相应给正确的目的地客户端?

    作者回复: 是根据请求信息,一个请求绑定了一个tcp连接

    2019-07-29
    1
  • pain
    老师,开启了异步,感觉还是不够啊。有大量请求的时候,socket 链接都有问题。有什么进一步提升的方法吗

    作者回复: 说明Web应用本身处理比较慢,看慢在哪里,一般是数据库,或者下游服务

    2019-07-24
    1
    1
  • 非想
    老师您好,请问下怎么理解tomcat线程和servlet线程,它们有什么区别,又是怎么关联的呢?

    作者回复: 线程分两种,Tomcat启动的线程和Web应用本身启动的线程:Tomcat线程池中的线程会调到Servlet的service方法,web程序在service方法的实现代码里启动新的线程叫做web应用线程

    2019-07-14
    1
  • 木木匠
    “请你注意 createSocketProcessor 函数的第二个参数是 SocketEvent,这里我们传入的是 OPEN_READ。通过这个参数,我们就能控制 SocketProcessor 的行为”,请问这里是如何通过OPEN_READ来控制的呢?
    2019-10-11
    1
  • PETER DONG
    印象中有个典型应用 spring的sockjs handler
    通过异步sevlet向client主动推心跳
    2019-09-06
  • 星辰
    有很多不舍
    知道您平时一定也很忙
    都是挤出时间来写专栏
    且要反复核对 还要关心留言评论

    老师您先好好休息一下 调整调整 真心期待您后续的专栏 文章 或者书 或者其他什么。
    这个专栏配套代码看个三五遍应该就明白一些了

    有些人不知道有这么好的专栏 是还没有被挖掘
    等被不知道的人挖掘了,或者现在看专栏的人,我相信他们和我一样 都很喜欢这个专栏!

    作者回复: 谢谢酱油君😄

    2019-08-22
  • 星辰
    1. 要是咱们tomcat有个微信群估计会很活跃 因为太常用了

    2. 老师 好希望您能再出一个专栏 😭😭😭 因为都是贴着代码分析的 讲的太好了

    3. 珍惜 感恩 不舍! 😭😭😭
    2019-08-22
  • Feng.X
    老师, 请问对Map<S,Processor> connections里的Processor的取出操作是在SocketWrapper的processSocket 方法里吗?

    作者回复: 对的

    2019-07-13
  • nightmare
    异步servlet相当于用户控制开启和完成,在protohandler通过类似future的机制来完成异步操作
    2019-07-11
收起评论
13
返回
顶部