【问题标题】:Asynchronous Servlets vs. synchronous Servlets异步 Servlet 与同步 Servlet
【发布时间】:2010-01-29 15:07:38
【问题描述】:

因为支持Servlet 3.0 asynchronous processing。总是使用异步处理会更好吗?或者在什么情况下同步处理更好?

【问题讨论】:

    标签: java servlets asynchronous jakarta-ee


    【解决方案1】:

    使用异步 servlet 获得的最大好处是 HTTP push,服务器可以在选择时将信息发送回客户端,而不是在客户端请求时。 Pre-asynch servlet,这将需要长时间运行的 HTTP 连接,每个连接都占用一个服务器线程,这是非常低效的。这种新模型将服务器端处理与连接处理分离。

    【讨论】:

    • 如果您在服务器端检查 ajax 数据并且用户转到不同的网页会发生什么?那么现在他们不再需要这些数据了吗?或者如果用户刷新页面会发生什么?现在服务器端会不会有两个实例检查来自用户的数据?
    【解决方案2】:

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

    我们需要这样的原因是为了响应每个请求线程模型中的问题,每次客户端从服务器请求页面时都会分配一个线程,而不是为客户端的整个请求分配一个线程会议。在 AJAX 之前,当客户端偶尔发出请求时,这种方法效果很好,但是当 AJAX 应用程序显着增加客户端发出的请求数量时,这种好处就消失了。

    具体来说,如果 AJAX 请求触发了一些可能很慢或阻塞的事情,比如数据库操作,我们就会回到我们开始的地方——来自服务器线程池的线程可能处于空闲状态。

    异步处理支持试图通过将请求放入一个集中队列来缓解这种情况,这样线程并不总是卡在等待可能尚未开始处理的请求的结果。简而言之,我们一直试图从我们的线程中获得最大的收益——也就是说,减少它们空闲的时间(但可能正在服务于其他一些连接)。

    与任何新开发一样,这不是一种万能的工具。在您的应用程序中寻找合适的具体案例。

    【讨论】:

      【解决方案3】:

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

      在所有情况下都使用异步处理没有任何价值,因为通常后端处理无论如何都会消耗一个线程。

      【讨论】:

        【解决方案4】:

        我只是浏览了链接的文章,这是服务器端的改进,而不是客户端异步。

        总结文章:

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

        作业将卡在作业队列中,线程可以退出,直到作业完成,并且在资源释放以允许其完成时最终提交响应。

        很酷的东西。

        【讨论】:

          【解决方案5】:

          它基于在这种情况下线程处于空闲状态的任何机会你应该使用异步 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.
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-17
            • 2011-08-23
            • 2017-02-09
            • 1970-01-01
            • 1970-01-01
            • 2011-06-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多