单个 servlet 如何处理来自客户端的多个请求

How does a single servlet handle multiple requests from client side

单个 servlet 如何处理以用户请求形式出现的多个客户端请求?基于单例设计模式,我知道我们创建了一个 servlet 实例,但单个 servlet 如何处理数百万个请求。对其中涉及的线程也感到困惑。

还有任何浏览器规范或设置在这里派上用场,用于发送请求或生成为请求发送的线程。

所有框架都一样还是不同,例如 struts v/s springs?

Struts/Spring 框架实际上是在 Servlet 规范之上编写的,因此无论您在其下使用什么,都使用 Servlet。

你是对的,只创建了 Servlet 的单个实例,但该实例在多个线程之间共享。出于这个原因,您永远不应该在您的 Servlet 中共享可变状态。

例如,您将以下 servlet 映射到 http://localhost/myservlet

class MySerlvet extends HttpServlet {

     public void doGet(HttpServletRequest req, HttpServletResponse res) {
          // Get Logic
     }    
}

Web 服务器的代码中会有类似(不一定相同)的内容。

MyServlet m = new MyServlet(); // This will be created once

// for each request for http://localhost/myservlet
executorService.submit(new RequestProcessingThread(m));

每个请求都在单独的线程中处理。这并不意味着 Tomcat 为每个请求创建一个新线程。有一个线程池来处理请求。每个 servlet 也有一个实例,这是默认情况。(Some more information)。 您的 servlet 应该是 Thread Safe 即它应该是无状态的。

如果您的 servlet 实现了 SingleThreadModel 接口,则每个线程都使用单独的 servlet 实例。 SingleThreadModel is deprecated,不要使用它。

我把这个答案作为社区维基。

您没有创建 servlet 的多个实例。 servlet 引擎为每个请求使用线程池中的一个单独线程(最多分配一些最大线程数)。

性能与线程数有关,与servlet实例数无关

比如有1000个请求,servlet最多可以产生100个线程,那么就会有性能下降。

为了避免这个问题,我们可以使用负载均衡器,将多个服务器放在一个负载均衡器后面。 负载均衡器应配置为 "route" 根据不同 parameters/settings(循环分配、负载分配等)对任何一台服务器的请求。您需要的负载越多,您应该添加的服务器就越多。但是,这确实会通过负载平衡器发送所有流量,因此重要的是它是冗余的并且是故障转移安全的。