【问题标题】:How does jetty handle multiple requestsjetty 如何处理多个请求
【发布时间】:2012-05-14 16:48:35
【问题描述】:

我已经使用 jetty/tomcat 应用服务器处理 Spring Web 应用程序大约两年了,但我仍然无法理解的是这些服务器中如何处理多个请求。我知道 spring 有助于制作单例,但我的理解仅限于此。 有人可以指出任何可以帮助我了解如何处理多个请求的好资源。

【问题讨论】:

    标签: jetty


    【解决方案1】:

    这可以在很多层面上回答我已经盯着它看了两天试图弄清楚如何回答它......所以我会采取一个有点高水平的镜头。

    jetty 监听这个服务器端口和一些接受者线程,它们的工作是获取客户端和服务器端之间的连接对象。一旦你有了这个连接,它就会流经码头处理程序架构,可能会做一些事情,比如身份验证,或者提取一个会话 ID 并将一个会话对象附加到请求中。然后它进入 servlet 处理程序并找到适当的 servlet 并开始处理 servlet-api。那时,您在 servlet-api 中的所有时间都为您的请求分配了一个线程,至少在 servlet 2.5 下。在 servlet 3.0 中,您可以使用一些异步机制,或者您可以使用 jetty-continuations 作为在 servlet 2.5 api 上获得异步支持的一种方式。

    无论如何,服务器使用线程池将线程分配给那些连接器,这些连接器最终是将所有时间都花在 servlet-api 中的线程。 jetty continuations api 和较新的 servlet 3.0 支持提供了将线程释放回主线程池的机制,以便它们可以花时间接受和处理其他请求。

    在与 nio api 的使用以及码头如何有效地管理所有这些内容相关的内容下,显然还有很多事情要做,但也许这足以满足您最初的问题。如果没有,请随意阅读码头文档 (http://www.eclipse.org/jetty/documentation/current) 或查看码头邮件列表。在 Webtide (http://webtide.com/blogs) 的博客中,已经有一些关于 jetty-9 优化的讨论,因为它与 http、spdy 和 websocket 连接处理和处理有关。

    【讨论】:

    • 虽然我非常感谢您提供的洞察力。我仍然对一件事感到好奇。如果有一个请求线程池正在等待执行,那么当前只有一个线程通过我在 spring 中编写的一段 webapp 代码,或者我是否有可能拥有该代码的多个副本并且多个请求可以送达
    • servlet 不是线程安全的,多个线程可以遍历同一个 service() 或 doPost() 方法,“状态”与进入方法和线程本身的变量一起保存。虽然您可以使 servlet 本身具有自己的状态并使用同步来管理事物,但您通常不希望您的 servlet 是单线程的,但整个想法是能够同时为多个请求提供服务,而当您让线程阻塞在像 servlet 这样简单的东西上。
    • @jessemcconnell 是否有任何关于在 servlet 3.0 中切换到异步模式(以及它如何帮助减少请求数量)的文档/撰写/博客?
    猜你喜欢
    • 2018-08-19
    • 2013-01-12
    • 2013-01-31
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2021-03-27
    • 2019-01-08
    相关资源
    最近更新 更多