34

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

4

1 回答 1

38

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

有一个码头监听的服务器端口和一些接受者线程,它们的工作是获取客户端和服务器端之间的连接对象。一旦你有了这个连接,它就会流经码头处理程序架构,可能会做一些事情,比如身份验证,或者提取一个会话 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 连接处理和处理有关。

于 2012-05-16T20:40:28.047 回答