相关文章推荐
飘逸的花卷  ·  N阶Butterworth滤波器的频率响应( ...·  1 年前    · 
谦虚好学的烤红薯  ·  Tensorflow从入门到精通系列教程(一 ...·  2 年前    · 
捣蛋的手套  ·  问题: ...·  2 年前    · 
豪爽的麻辣香锅  ·  美股评论:美元的周期性牛市|美元|周期性|牛 ...·  2 年前    · 
Code  ›  Servlet 3.0 异步处理详解开发者社区
servlet response
https://cloud.tencent.com/developer/article/1355893
慷慨的键盘
2 年前
作者头像
颇忒脱
0 篇文章

Servlet 3.0 异步处理详解

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 颇忒脱的技术博客 > 正文

Servlet 3.0 异步处理详解

发布 于 2018-10-19 14:41:17
833 0
举报

Github地址

相关系列文章:

  • Servlet 3.1 Async IO分析
  • Spring MVC异步处理的几种方式

Servlet 3.0 开始提供了AsyncContext用来支持异步处理请求,那么异步处理请求到底能够带来哪些好处?

Web 容器 一般来说处理请求的方式是:为每个request分配一个thread。我们都知道thread的创建不是没有代价的,Web容器的thread pool都是有上限的。 那么一个很容易预见的问题就是,在高负载情况下,thread pool都被占着了,那么后续的request就只能等待,如果运气不好客户端会报等待超时的错误。 在AsyncContext出现之前,解决这个问题的唯一办法就是扩充Web容器的thread pool。

但是这样依然有一个问题,考虑以下场景:

有一个web容器,线程池大小200。有一个web app,它有两个servlet,Servlet-A处理单个请求的时间是10s,Servlet-B处理单个请求的时间是1s。 现在遇到了高负载,有超过200个request到Servlet-A,如果这个时候请求Servlet-B就会等待,因为所有HTTP thread都已经被Servlet-A占用了。 这个时候工程师发现了问题,扩展了线程池大小到400,但是负载依然持续走高,现在有400个request到Servlet-A,Servlet-B依然无法响应。

看到问题了没有,因为 HTTP thread和Worker thread耦合在了一起(就是同一个thread) ,所以导致了当大量request到一个耗时操作时,就会将HTTP thread占满,导致整个Web容器就会无法响应。

但是如果使用AsyncContext,我们就可以将耗时的操作交给另一个thread去做,这样HTTP thread就被释放出来了,可以去处理其他请求了。

注意,只有使用AsyncContext才能够达到上面所讲的效果,如果直接new Thread()或者类似的方式的,HTTP thread并不会归还到容器。

下面是一个官方的例子:

@WebServlet(urlPatterns={"/asyncservlet"}, asyncSupported=true)
public class AsyncServlet extends HttpServlet {
   /* ... Same variables and init method as in SyncServlet ... */
   @Override
   public void doGet(HttpServletRequest request, 
                     HttpServletResponse response) {
      response.setContentType("text/html;charset=UTF-8");
      final AsyncContext acontext = request.startAsync();
      acontext.start(new Runnable() {
         public void run() {
            String param = acontext.getRequest().getParameter("param");
            String result = resource.process(param);
            HttpServletResponse response = acontext.getResponse();
            /* ... print to the response ... */
            acontext.complete();
 
推荐文章
飘逸的花卷  ·  N阶Butterworth滤波器的频率响应(Python实现)_python如何绘制滤波器的频率响应图-CSDN博客
1 年前
谦虚好学的烤红薯  ·  Tensorflow从入门到精通系列教程(一) - 知乎
2 年前
捣蛋的手套  ·  问题: java.lang.NullPointerException:参数不能为空 - 问答 - 腾讯云开发者社区-腾讯云
2 年前
豪爽的麻辣香锅  ·  美股评论:美元的周期性牛市|美元|周期性|牛市_新浪财经_新浪网
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号