相关文章推荐
暴走的烤地瓜  ·  json.decoder.JSONDecod ...·  3 月前    · 
睡不着的卡布奇诺  ·  Android中使用OkHttp3无法获取响 ...·  2 月前    · 
唠叨的紫菜汤  ·  okhttp——RetryAndFollow ...·  2 月前    · 
痴情的可乐  ·  .NET Core MVC ...·  1 月前    · 
玩命的葫芦  ·  在客户端直接上传文件到OSS-对象存储(OS ...·  1 月前    · 
听话的跑步鞋  ·  iOS - Sqlite ...·  2 年前    · 
眉毛粗的豆浆  ·  利用人工智能AI将蒙娜丽莎,转变为一个栩栩如 ...·  2 年前    · 
重感情的沙滩裤  ·  浅析 Linux 初始化 init ...·  2 年前    · 
淡定的玉米  ·  Get exclusive jobs on ...·  3 年前    · 
闯红灯的爆米花  ·  使用opencv实现实例分割,一学就会|附源 ...·  3 年前    · 
Code  ›  Servlet 3.0 异步处理详解开发者社区
servlet response
https://cloud.tencent.com/developer/article/1355893
慷慨的键盘
3 年前
作者头像
颇忒脱
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();
 
推荐文章
暴走的烤地瓜  ·  json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) - 找回失去的自我
3 月前
睡不着的卡布奇诺  ·  Android中使用OkHttp3无法获取响应问题求助
2 月前
唠叨的紫菜汤  ·  okhttp——RetryAndFollowUpInterceptor开发者社区
2 月前
痴情的可乐  ·  .NET Core MVC C#应用上传文件至Amazon S3的用户文件隔离方案问询
1 月前
玩命的葫芦  ·  在客户端直接上传文件到OSS-对象存储(OSS)-阿里云帮助中心
1 月前
听话的跑步鞋  ·  iOS - Sqlite 数据库服务层优化过程 - 简书
2 年前
眉毛粗的豆浆  ·  利用人工智能AI将蒙娜丽莎,转变为一个栩栩如生会动的艺术作品
2 年前
重感情的沙滩裤  ·  浅析 Linux 初始化 init 系统,第 1 部分: sysvinit 第 2 部分: UpStart 第 3 部分: Systemd - xiaohuazi - 博客园
2 年前
淡定的玉米  ·  Get exclusive jobs on InCareer
3 年前
闯红灯的爆米花  ·  使用opencv实现实例分割,一学就会|附源码-阿里云开发者社区
3 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号