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

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

此外,任何浏览器规范或设置都可以方便地用于发送请求或生成为请求发送的线程。

对于所有框架是否相同,或者它与struts v / s spring不同?

Struts / Spring框架实际上是在Servlet规范之上编写的,所以无论你在它下面使用什么都使用Servlets。

你是对的,只创建了一个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都有一个实例,这是默认情况。( 更多信息 )。 您的servlet应该是Thread Safe

在此处输入图像描述

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

SingleThreadModel的

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

您不创建多个servlet实例。 servlet引擎为每个请求创建一个单独的Thread(最多为一些最大线程数)。性能与线程数有关,而不是servlet实例数。

例如,如果有1000个请求,并且servlet可以生成的最大线程数为100,那么性能会下降。

为了避免这个问题,我们可以通过将多个服务器放在负载均衡器后面来使用负载均衡器。 负载均衡器应配置为根据不同的参数/设置(循环分配,负载分配等)将请求“路由”到任何一个服务器。 您需要的负载越多,您应该添加的服务器就越多。 但是,这确实会通过负载均衡器发送所有流量,因此重要的是冗余和故障转移安全。