异步Servlet与同步Servlet

29

自从支持Servlet 3.0异步处理以来,是否始终使用异步处理更好呢?或者在什么情况下同步处理更好呢?

5个回答

42
异步servlet最大的优势在于HTTP推送,服务器可以在自己选择的时间向客户端发送信息,而不是等待客户端请求。在异步servlet之前,这需要长时间运行的HTTP连接,每个连接都会占用一个服务器线程,非常低效。这种新模型将服务器端处理与连接处理分离。

2
如果您正在服务器端检查ajax数据,而用户转到不同的网页会发生什么?那么现在他们不再需要那些数据了吗?或者如果用户刷新页面会发生什么?现在服务器端会有两个实例来检查用户的数据吗? - gmustudent

20

阅读这篇文章,Servlet 3.0规范中的异步处理支持具有非常特定的用例-它旨在处理这样一种情况:您拥有一个AJAX应用程序,该应用程序发出请求以触发潜在长时间运行的后台进程。

我们需要像这样的功能是为了响应线程每个请求模型中存在的问题。该模型在客户端从服务器请求页面时会分配一个线程,而不是为客户端的整个会话分配单个线程。这在 AJAX 之前有效运行,因为客户端只会偶尔发出请求,但是当 AJAX 应用程序显着增加了客户端发出的请求数量时,这些好处就失去了。

具体而言,如果 AJAX 请求触发某些潜在缓慢或阻塞的操作(例如数据库操作),那么我们又回到了起点-来自服务器线程池的线程可能会空闲。

通过将请求放入集中的队列中,异步处理支持试图减轻这种情况,从而使线程不总是被卡在等待尚未开始处理的请求的结果上。简而言之,我们试图始终充分利用线程-即减少它们处于空闲状态(但可能正在为其他连接提供服务)的时间。

像任何新的开发一样,这不是一个大小适合所有情况的工具。请查找您的应用程序中适用的特定情况。


4

异步处理是为了在整个请求处理周期中不需要持有线程的情况下引入的。这种情况的典型示例是类似comet的功能。

在所有情况下使用异步处理都没有意义,因为通常后端处理仍然会消耗一个线程。


2

我只是粗略地浏览了这篇文章,这是一种服务器端的改进,而不是客户端异步。

文章概述:

在有大量请求涌入(类似于使用AJAX请求攻击服务器)且不想为每个请求提供一个线程时,您会希望在这种情况下使用异步servlet。在处理时间较长的情况下,TPR可能会很危险,因为它会耗尽线程池。

该作业将被置于作业队列中,并且当资源释放以允许其完成时,线程可以被挂起直到作业完成并最终提交响应。

相当酷的东西。


1

这是基于需求的,如果一个线程处于空闲状态,那么应该使用异步Servlet;否则不能使用,因为我们不能创建太多的线程。

如果一个Servlet或过滤器在处理请求时遇到潜在的阻塞操作,则可以将操作分配给异步执行上下文,并立即将与请求关联的线程返回给容器,而不生成响应。阻塞操作在异步执行上下文中的不同线程中完成,该线程可以生成响应或将请求分派到另一个Servlet。

要在Servlet上启用异步处理,请在@WebServlet注释上将asyncSupported参数设置为true,如下所示:

@WebServlet(urlPatterns={"/asyncservlet"}, asyncSupported=true) public class AsyncServlet extends HttpServlet { ... }

同步(经典Web应用程序模型) 同步请求会阻塞客户端,直到操作完成,即浏览器无响应。在这种情况下,浏览器的JavaScript引擎被阻塞。

异步(AJAX Web应用程序模型) 异步请求不会阻塞客户端,即浏览器是响应的。此时,用户还可以执行其他操作。在这种情况下,浏览器的JavaScript引擎不会被阻塞。

在同步通信中,两者同时处于活动状态,而在异步通信中,不需要同时处于活动状态。例如,异步指的是将阻塞操作消息传递到新线程并运行与容器相关联的线程。
应用服务器中的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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接