[英]How does a single servlet handle multiple requests from client side
单个 servlet 如何处理以用户请求形式出现的多个客户端请求? 根据单例设计模式,我知道我们创建了一个 servlet 实例,但是单个 servlet 如何处理数百万个请求。 也对其中涉及的线程感到困惑。
还有任何浏览器规范或设置在这里很方便,用于发送请求或生成为请求发送的线程。
它对所有框架都相同还是不同,例如 struts v/s springs ?
每个请求都在一个单独的线程中处理。 这并不意味着 Tomcat 会为每个请求创建一个新线程。 有一个线程池来处理请求。 每个 servlet 也有一个实例,这是默认情况。( 更多信息)。 您的 servlet 应该是Thread Safe
即它应该是无状态的。
如果您的 servlet 实现SingleThreadModel
接口,则每个线程使用单独的 servlet 实例。 SingleThreadModel
已弃用,请勿使用。
我将这个答案作为社区维基。
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));
您不会创建 servlet 的多个实例。 servlet 引擎为每个请求使用来自线程池的单独线程(最多分配一些最大线程数)。
性能与线程数有关,与 servlet 的实例数无关。
比如有1000个请求,servlet最多可以产生100个线程,那么性能就会下降。
为了避免这个问题,我们可以通过将多个服务器放在一个负载均衡器后面来使用负载均衡器。 负载平衡器应配置为根据不同的参数/设置(循环分配、负载分配等)将请求“路由”到任何一台服务器。 您需要的负载越多,您应该添加的服务器越多。 但是,这确实通过负载平衡器发送所有流量,因此重要的是这是冗余和故障转移安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.