当前位置: 首页 > 面试题库 >

每个连接线程与每个请求线程之间的区别是什么?

贲俊才
2023-03-14
问题内容

您能否解释一下已经在各种servlet实现中实现的两种方法:

  1. 每个连接线程
  2. 每个请求的线程

以上两种策略中的哪一种可以更好地扩展,为什么?


问题答案:

以上两种策略中的哪一种可以更好地扩展,为什么?

每个请求线程的可伸缩性比每个连接线程的可伸缩性更好。

Java线程非常昂贵,通常每个线程都使用1Mb的内存段,无论它们是活动的还是空闲的。如果为每个连接提供自己的线程,则该线程通常在连接的连续请求之间处于空闲状态。最终,框架需要停止接受新的连接(因为它无法创建更多线程),或者开始断开旧的连接(如果/当用户醒来时会导致连接中断)。

尽管由于TCP / IP的工作方式,每个IP地址有64K个开放连接的限制,但HTTP连接所需的资源比线程堆栈少得多。

相反,在每个请求线程模型中,仅在处理请求时才将线程关联。这通常意味着服务需要更少的线程来处理相同数量的用户。而且由于线程使用大量资源,这意味着该服务将具有更大的可伸缩性。

(并且请注意,每个请求线程数并不意味着框架必须关闭HTTP请求之间的TCP连接…)

话虽这么说,当每个请求的处理过程中出现长时间的停顿时,每个请求线程模型并不理想。(并且,当服务使用彗星方法时,这涉及长时间保持答复流处于打开状态,这是不理想的。)为此,Servlet
3.0规范提供了一种“异步Servlet”机制,该机制允许Servlet的request方法执行以下操作:暂停其与当前请求线程的关联。这将释放线程去处理另一个请求。

如果可以将Web应用程序设计为使用“异步”机制,则它可能比每个请求线程或每个连接线程更具可伸缩性。

跟进

假设一个网页包含1000张图片。这导致1001个HTTP请求。进一步假设使用HTTP持久连接。使用TPR策略,这将导致1001线程池管理操作(TPMO)。使用TPC策略,这将产生1个TPMO
…现在,根据单个TPMO的实际成本,我可以想象出TPC可能比TPR更好地扩展的情况。

我认为有些事情您尚未考虑:

  • Web浏览器面临许多URL,需要提取这些URL才能完成页面,因此很可能会打开多个连接。

  • 使用TPC和持久连接,线程必须等待客户端接收响应并发送下一个请求。如果网络等待时间较长,则此等待时间可能很长。

  • 服务器无法知道何时可以关闭给定的(持久)连接。如果浏览器没有关闭它,它可能会“徘徊”,绑住TPC线程,直到服务器超时连接为止。

  • TPMO开销不是很大,尤其是当您将池开销与上下文切换开销分开时。(您需要这样做,因为TPC会在持久连接上引发上下文切换;请参见上文。)

我的感觉是,这些因素可能比为每个连接分配一个线程而节省的TPMO多。



 类似资料:
  • 问题内容: servlet类有多个实例吗?当我听到“每个servlet实例”时,有人可以详细说明吗? 问题答案: Servlet容器启动时,它: 读; 在类路径中找到已声明的Servlet;和 加载和实例化每个Servlet一次。 大概是这样的: 这些Servlet都存储在内存中,并且每次请求URL与Servlet的关联的匹配时都可以重用url-pattern。然后,Servlet容器执行类似于以

  • 测试结构: Thread1-Sampler1(例如:访问登录表单) 我试着把计时器当作取样器,不管是父母还是孩子。也许我错过了什么,因为没有一个计时器在为我工作。 我已经找到了类似的问题解决方案,但没有一个对我有用:JMeter——在多个线程组之间共享请求之间的延迟Ultimate thread Group中每个线程的延迟

  • 问题内容: 每个连接异步套接字的非阻塞Java NIO仍然比标准线程慢吗? 另外,如果要在每个连接中使用线程,是仅创建新线程还是使用很大的线程池? 我正在用Java写一个MMORPG服务器,如果有足够强大的硬件,它应该能够轻松扩展10000个客户端,尽管最大客户端数量是24000(由于15000个线程,我认为每个连接模型的线程都无法达到) Java中的限制)。从三年前的一篇文章中,我听说每个连接模

  • 给stackoverflow社区的人们。我正在寻找一些帮助,以解决HikariCP连接池面临的问题。 高级:我正在尝试使用线程池创建多个线程,我的计划是为每个工作线程提供独立于HikariCP的连接,但HikariCP所做的是在多个线程之间共享一个公共连接。我正在使用 以检索DB连接。现在,当我关闭一个连接时,我在其他线程中看到问题,说连接关闭了,线程正在处理的批次记录被丢弃。 以下是我的日志文件

  • 我对所有这些异步/多线程lib和本地clojure功能感到迷茫。 我有一个Web服务,它调用外部API,转换它响应,然后回馈给客户端。现在是用Python编写的。我想让每个客户端在单独的线程中执行其请求,这样它们就不会等待彼此完成,或者服务器是异步的。不涉及繁重的计算,只需等待IO。 我原以为使用clojure会很容易,但是我忽略了一些东西...Aleph是异步服务器吧?然而,当我在请求处理程序中

  • 基于每个JVM的CPU核数创建线程与在多个JVM上运行的线程在CPU核数上创建线程数,条件是所有JVM运行在共享同一CPU的一个物理系统上有何不同?换句话说,一个并行运行8个线程的多线程Java程序vs在共享同一CPU的8个不同JVM上运行的同一多线程程序? 下面我给出了一些我发现的用线程实现并行处理的方法,但是我不能理解它们之间的本质区别? 方法一:线程周期性地查询数据库更改,并行地启动(长时间