【发布时间】:2010-01-29 15:07:38
【问题描述】:
因为支持Servlet 3.0 asynchronous processing。总是使用异步处理会更好吗?或者在什么情况下同步处理更好?
【问题讨论】:
标签: java servlets asynchronous jakarta-ee
因为支持Servlet 3.0 asynchronous processing。总是使用异步处理会更好吗?或者在什么情况下同步处理更好?
【问题讨论】:
标签: java servlets asynchronous jakarta-ee
使用异步 servlet 获得的最大好处是 HTTP push,服务器可以在选择时将信息发送回客户端,而不是在客户端请求时。 Pre-asynch servlet,这将需要长时间运行的 HTTP 连接,每个连接都占用一个服务器线程,这是非常低效的。这种新模型将服务器端处理与连接处理分离。
【讨论】:
阅读这篇文章,Servlet 3.0 规范中的异步处理支持有一个非常具体的用例 - 它旨在处理您的 AJAX 应用程序发出的请求会在后台触发可能长时间运行的进程的情况。
我们需要这样的原因是为了响应每个请求线程模型中的问题,每次客户端从服务器请求页面时都会分配一个线程,而不是为客户端的整个请求分配一个线程会议。在 AJAX 之前,当客户端偶尔发出请求时,这种方法效果很好,但是当 AJAX 应用程序显着增加客户端发出的请求数量时,这种好处就消失了。
具体来说,如果 AJAX 请求触发了一些可能很慢或阻塞的事情,比如数据库操作,我们就会回到我们开始的地方——来自服务器线程池的线程可能处于空闲状态。
异步处理支持试图通过将请求放入一个集中队列来缓解这种情况,这样线程并不总是卡在等待可能尚未开始处理的请求的结果。简而言之,我们一直试图从我们的线程中获得最大的收益——也就是说,减少它们空闲的时间(但可能正在服务于其他一些连接)。
与任何新开发一样,这不是一种万能的工具。在您的应用程序中寻找合适的具体案例。
【讨论】:
在整个请求处理周期内不需要保持线程的情况下引入了异步处理。这种情况的典型示例是类似comet 的功能。
在所有情况下都使用异步处理没有任何价值,因为通常后端处理无论如何都会消耗一个线程。
【讨论】:
我只是浏览了链接的文章,这是服务器端的改进,而不是客户端异步。
总结文章:
您可能希望在有大量请求进入的情况下使用异步 servlet(类似于用 AJAX 请求攻击您的服务器),并且您不想为每个请求提供一个线程。在这种情况下,TPR 可能很危险,因为处理时间需要一点时间,导致您耗尽线程池。
作业将卡在作业队列中,线程可以退出,直到作业完成,并且在资源释放以允许其完成时最终提交响应。
很酷的东西。
【讨论】:
它基于在这种情况下线程处于空闲状态的任何机会你应该使用异步 Servlet 否则不是因为我们不能创建这么多线程
如果 servlet 或过滤器在处理请求时遇到潜在的阻塞操作,它可以将操作分配给异步执行上下文,并立即将与请求关联的线程返回到容器而不生成响应。阻塞操作在不同线程的异步执行上下文中完成,该线程可以生成响应或将请求分派到另一个 servlet。
要在 servlet 上启用异步处理,请在 @WebServlet 注释上将参数 asyncSupported 设置为 true,如下所示:
@WebServlet(urlPatterns={"/asyncservlet"}, asyncSupported=true) 公共类 AsyncServlet 扩展 HttpServlet { ... }
同步(经典 Web 应用程序模型) 同步请求会阻塞客户端,直到操作完成,即浏览器没有无响应。在这种情况下,浏览器的java脚本引擎被阻塞。
异步(AJAX Web 应用程序模型) 异步请求不会阻塞客户端,即浏览器是响应式的。此时,用户还可以执行其他操作。在这种情况下,浏览器的java脚本引擎不会被阻塞。
在同步通信中,两者同时处于活动状态,而在异步中则不需要同时处于活动状态,例如异步是指将消息阻塞操作到新线程并运行与容器关联的线程
应用服务器中的 Web 容器通常使用每个客户端请求的服务器线程。在重负载条件下,容器需要大量线程来服务所有客户端请求。可扩展性限制包括内存不足或容器线程池耗尽。要创建可扩展的 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.
【讨论】: