深入拆解 Tomcat & Jetty
李号双
eBay 技术主管
38890 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
深入拆解 Tomcat & Jetty
15
15
1.0x
00:00/00:00
登录|注册

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

通过SocketProcessor处理响应数据发送到浏览器
调用Request对象的action方法通知连接器异步请求处理完成
通过action方法设置Request对象为异步Servlet请求
通知Tomcat不要将响应发送到浏览器
创建AsyncContext对象
运用隔离的思想在Web应用内部
适合异步Servlet的场景
异步Servlet机制
非阻塞I/O模型
complete方法
startAsync方法
调用AsyncContext的complete方法
使用线程池处理耗时操作
调用startAsync方法获取异步上下文AsyncContext
注解方式注册Servlet
课后思考
本期精华
异步Servlet原理
异步Servlet示例
Tomcat如何支持异步Servlet

该思维导图由 AI 生成,仅供参考

通过专栏前面的学习我们知道,当一个新的请求到达时,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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Tomcat如何支持异步Servlet? Tomcat和Jetty在处理请求时会从线程池中获取线程来处理请求,但当Web应用需要较长时间处理请求时,Tomcat线程会一直阻塞,导致系统资源占用和线程饥饿。为解决这一问题,Servlet 3.0引入了异步Servlet机制。通过示例代码和原理解释,文章介绍了如何开发异步Servlet以及Tomcat如何支持异步Servlet。异步Servlet通过创建AsyncContext对象保存请求的中间信息,使得Tomcat工作线程在调用startAsync方法后能够结束并回到线程池中,而不会销毁Request和Response对象。当请求处理完成时,Web应用调用complete方法,通知Tomcat当前异步请求处理完毕,Tomcat通过SocketProcessor任务类处理响应数据发送到浏览器。异步Servlet机制减少了线程的阻塞等待,提高了系统的吞吐量,适合于需要长时间处理请求且Tomcat线程不够的场景。 文章通过简洁的示例和详细的原理解释,让读者能够快速了解异步Servlet的实现原理和Tomcat的支持机制,为读者提供了深入理解异步Servlet的途径。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Tomcat & Jetty 》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(17)

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

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

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

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

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

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

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

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

    2019-07-24
    2
    5
  • Geek_ebda96
    老师,请问一个请求进来之后,如果采用异步servlet来处理,原来的请求tomcat线程被回收,那本身这个请求要再相应给客户端,怎么知道是哪个客户端请求过来的,是根据servlet力的request信息,获取客户端地址,相应给客户端吗?这个根你后面讲的complete有关系吗,具体是怎么相应给正确的目的地客户端?

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

    2019-07-29
    2
    4
  • FengX
    老师, 请问对Map<S,Processor> connections里的Processor的取出操作是在SocketWrapper的processSocket 方法里吗?

    作者回复: 对的

    2019-07-13
  • libocz
    老师,文章里边说ctx.complete方法不能直接把响应数据发送到浏览器,因为这件事情应该由Tomcat线程来做。这个是为什么呢?在应用线程里边的reponse直接调用write把数据写到输出流然后刷新这样不行吗?
    2020-08-04
    3
  • new life
    感觉 异步 servlet 只是释放了一个连接器分配的线程,并没有立刻给web响应,在web上感受到的还是同步,老师 我的理解对吗
    2019-08-07
    1
    2
  • 姑射仙人
    老师,LongPolling的实现与Servlet异步支持有什么关系吗,还有Spring中的DeferredResult。
    2021-04-26
    1
  • 惘 闻
    看晕了... SocketProcessor 到底在一个异步请求中创建了多少个啊. 1. 我们知道,连接器中的 Endpoint 组件检测到有请求数据达到时,会创建一个 SocketProcessor 对象交给线程池去处理 2. 在异步 Servlet 的场景里,Web 应用通过调用ctx.complete方法时,也可以生成一个新的 SocketProcessor 任务类,交给线程池处理。 3.而 SocketWrapper 的 processSocket 方法会创建 SocketProcessor 任务类 这是三句原话..所以是一个请求+响应一共使用了三个SocketProcessor 吗?
    2021-01-26
    2
    1
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部