java - 异步 servlet vs 同步 servlet

  显示原文与译文双语对照的内容

由于 Servlet 3.0异步处理是受支持的。 使用总是异步处理会更好? 或者在什么情况下同步处理更好?

时间:

异步servlet的大事你是 HTTP,服务器可以火信息回客户机选择的时候,而不是当客户问。 Pre-asynch servlet,这需要长时间运行的HTTP连接,每个连接都占用一个服务器线程,这非常低效。 这个新模型将server-side处理与连接处理分离。

阅读这篇文章,异步处理支持servlet 3.0规范有一个非常具体的用例,它旨在处理ajax应用程序的情况下使请求在后台触发可能长时间运行的流程。

我们需要的内容是响应thread-per-request模型中的问题,它每次客户端请求来自服务器的页面时,都会分配线程,而不是为整个客户端会话分配单个线程。 这个工作之前ajax当客户偶尔会请求,但好处是ajax应用程序时丢失显著增加一个客户机的请求数量。

具体来说,如果一个ajax请求触发可能减缓或阻止的东西,像一个数据库操作,我们回到我们的起点——threadpool线程的服务器可能闲置。

异步处理支持试图减轻这种通过将请求到一个集中的队列,这样线程并不总是等待结果的请求,甚至可能没有开始加工。 简而言之,我们要的是我们的责任我们的线程在任何时候——也就是说,减少闲置( 但可以提供其他的连接) 时的时间。

像任何新的开发一样,这不是一个one-size-fits-all工具所要使用的东西。 在应用程序中查找合适的案例。

在整个请求处理周期中不需要保持线程时,就会为这些情况引入异步处理。 这种情况的典型例子是 comet -like功能。

在所有情况下使用异步处理都不值得,因为通常back-end处理会消耗一个线程。

我只是浏览了链接文章,这是一个server-side改进,而不是client-side异步。

总结本文:

你希望在有请求负载的情况下使用非 Asynchronous servlet,并且不希望每个请求都提供一个线程。 在这个场景中,当处理时间花一点时间,导致你耗尽线程池时,TPR可能会很危险。

工作将被困到一个工作队列和线程可以退休,直到任务完成和响应最后提交时释放的资源让它完成。

很酷的东西。

其基于requrirement任何机会一个线程进入空闲状态在这种情况下你应该使用异步servlet否则不是因为我们不能让太多的线程

如果一个servlet或者筛选器在处理一个请求时达到一个潜在的阻塞操作,它可以将操作分配给异步执行上下文,并返回与请求关联的线程,而不会立即生成响应。 阻塞操作在不同线程的异步执行上下文中完成,它可以生成响应或者将请求分派给另一个 servlet 。

启用异步处理servlet,asyncSupported的参数设置为true @WebServlet 注释如下:

@WebServlet(urlPatterns={"/asyncservlet"}, asyncSupported=true ) 公共类AsyncServlet扩展了 HttpServlet { 。 %7D

同步( 经典Web-Application模型) 同步请求阻塞客户端直到操作完成 换句话说,浏览器没有响应。 在这种情况下,浏览器的java脚本引擎被阻塞。

异步( AJAX Web-Application模型) 异步请求不阻止客户端 换句话说,浏览器正在响应。 此时,用户还可以执行另一个操作。 在这种情况下,浏览器的java脚本引擎不会被阻塞。

同步通信同时处于活动状态,同时异步不需要同步,例如异步引用一个新线程并运行与容器相关的线程

应用程序服务器中的站点容器通常使用每个客户端请求的服务器线程。 在重载条件下,容器需要大量的线程来满足所有客户端请求。 可伸缩性限制包括耗尽内存或者耗尽容器线程池。 要创建可以伸缩的web应用程序,你必须确保没有与请求相关的线程处于空闲状态,因此容器可以使用它们处理新请求。

有两个常见的场景,与请求关联的线程可以闲置。


The thread needs to wait for a resource to become available or process data before building the response. For example, an application may need to query a database or access data from a remote web service before generating the response.

The thread needs to wait for an event before generating the response. For example, an application may have to wait for a JMS message, new information from another client, or new data available in a queue before generating the response.

...