27 | 新特性:Tomcat如何支持异步Servlet?
该思维导图由 AI 生成,仅供参考
异步 Servlet 示例
- 深入了解
- 翻译
- 解释
- 总结
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-11623 - 非想老师您好,请问下怎么理解tomcat线程和servlet线程,它们有什么区别,又是怎么关联的呢?
作者回复: 线程分两种,Tomcat启动的线程和Web应用本身启动的线程:Tomcat线程池中的线程会调到Servlet的service方法,web程序在service方法的实现代码里启动新的线程叫做web应用线程
2019-07-1415 - 梁中华异步sevlet内部的业务应用中的IO也需要异步IO支持吧,就像vertx的异步模式,否则都堵塞在业务线程上就没意义了
作者回复: 说的对,所以Springboot webflux提供全异步的方案
2019-07-1210 - 柯察金老师,开启了异步,感觉还是不够啊。有大量请求的时候,socket 链接都有问题。有什么进一步提升的方法吗
作者回复: 说明Web应用本身处理比较慢,看慢在哪里,一般是数据库,或者下游服务
2019-07-2425 - Geek_ebda96老师,请问一个请求进来之后,如果采用异步servlet来处理,原来的请求tomcat线程被回收,那本身这个请求要再相应给客户端,怎么知道是哪个客户端请求过来的,是根据servlet力的request信息,获取客户端地址,相应给客户端吗?这个根你后面讲的complete有关系吗,具体是怎么相应给正确的目的地客户端?
作者回复: 是根据请求信息,一个请求绑定了一个tcp连接
2019-07-2924 - FengX老师, 请问对Map<S,Processor> connections里的Processor的取出操作是在SocketWrapper的processSocket 方法里吗?
作者回复: 对的
2019-07-13 - libocz老师,文章里边说ctx.complete方法不能直接把响应数据发送到浏览器,因为这件事情应该由Tomcat线程来做。这个是为什么呢?在应用线程里边的reponse直接调用write把数据写到输出流然后刷新这样不行吗?2020-08-043
- new life感觉 异步 servlet 只是释放了一个连接器分配的线程,并没有立刻给web响应,在web上感受到的还是同步,老师 我的理解对吗2019-08-0712
- 姑射仙人老师,LongPolling的实现与Servlet异步支持有什么关系吗,还有Spring中的DeferredResult。2021-04-261
- 惘 闻看晕了... SocketProcessor 到底在一个异步请求中创建了多少个啊. 1. 我们知道,连接器中的 Endpoint 组件检测到有请求数据达到时,会创建一个 SocketProcessor 对象交给线程池去处理 2. 在异步 Servlet 的场景里,Web 应用通过调用ctx.complete方法时,也可以生成一个新的 SocketProcessor 任务类,交给线程池处理。 3.而 SocketWrapper 的 processSocket 方法会创建 SocketProcessor 任务类 这是三句原话..所以是一个请求+响应一共使用了三个SocketProcessor 吗?2021-01-2621