同一虚拟服务器下的 Glassfish 实例中的多个 HTTP 线程池(配置)
Multiple HTTP thread pools (configuration) in a Glassfish instance under same virtual server
我在我的 Glassfish v3 实例中创建了一个新的专用 HTTP 线程池。当然,除了线程池,我还创建了一个带有专用端口的关联网络侦听器。但是,新创建的线程池和网络侦听器与现有 HTTP 线程池位于同一虚拟服务器中。从本质上讲,这意味着单个虚拟服务器将具有两个网络侦听器和两个线程池。
这样设计的原因是我希望新创建的线程池能够满足更长的 HTTP 请求(比如 50MB 的下载文件)。另一个 HTTP 线程池将迎合相对较小的请求,如网页下载,diag reports stats etc.The 新创建的线程池很有意义,因为客户端请求占用了 HTTP 工作线程资源。客户端下载文件 (50MB) 所需的时间越长,HTTP 资源因拒绝其他 HTTP 请求而被绑定的时间就越长。我不在外部公开端口。 Apache proxy pass 负责将我的请求路由到适当的端口。
我想了解这种方法是否有任何 flaw/drawback。
我使用的 Glassfish 版本是 3.1.1 或 v3
编辑
添加我对以下回复的评论以使问题更加清晰
但是,我的问题是了解在一个虚拟服务器下创建多个线程池是否存在任何问题。我们通常为每个域(或虚拟服务器)创建一个线程池。通过在单个域中创建两个线程池(和侦听器)我是否违反了任何规定或这被认为是正常做法?
我发现这种方法的唯一警告是。假设我有两个端口 8080 和 8085 分配给网络侦听器。所有在8080上可以访问,也可以通过8085端口访问的请求,这是预期的吗?但这更多是从测试的角度来看,因为无论如何我都不会在外部公开我的端口。
考虑以下场景:
假设:您没有任何逻辑来确定传入 HTTP 请求的大小和路由到特定线程池。
- 为 html 页面和轻量级请求提供服务的线程池 A 有要处理的 HTTP 请求,我们可以说由于线程同步问题有一些延迟。在这种情况下,考虑到 ThreadpoolA 已满,请求被路由到 threadpoolB,它可能有一些容量,但可能需要很长时间才能完成其大型 HTTP 请求。这会导致阻塞线程,无论它们的紧急程度如何。
- 假设您正在使用循环法将传入的 HTTP 请求路由到特定的线程池。如果您在某个时间点有两个或几个传入的大型 HTTP 请求,则您的两个线程池都忙于处理大型请求和 blocking/delaying 轻量级 http 请求。
假设: 您有一个逻辑来确定 HTTP 请求的大小并路由到特定的线程池。这将需要您捕获有关线程池现在占用情况的一些统计信息,并根据每个线程池的剩余工作量路由 http 请求来充分利用它们。如果没有,您可能有一个专用线程池,它只处理大型 http 请求,但在特定大小的大型 http 请求到达之前一直处于空闲状态,没有任何利用率。另外,假设您已将大小设置为 >=10MB 以路由到 ThreadpoolB,将 <10MB 路由到 ThreadpoolA,如果您有意想不到的少量请求,那么问题会更糟,让我们说 9MB,这已经相当大并且仍然不断命中 ThreadpoolA而 ThreadpoolB 是免费的,并且会阻止较小的 HTTP 请求。因此,确定何时路由 HTTP 请求的理想大小也是实现最佳性能的关键决定因素,这完全取决于应用程序的工作负载特征。
我觉得你的做法很有道理。
作为替代方案,您可以使用 Servlet 3.0 异步请求处理功能,并决定是否要将 long/heavy 请求直接委托给 Glassfish 中的单独线程,而不是使用 Apache。
我在我的 Glassfish v3 实例中创建了一个新的专用 HTTP 线程池。当然,除了线程池,我还创建了一个带有专用端口的关联网络侦听器。但是,新创建的线程池和网络侦听器与现有 HTTP 线程池位于同一虚拟服务器中。从本质上讲,这意味着单个虚拟服务器将具有两个网络侦听器和两个线程池。
这样设计的原因是我希望新创建的线程池能够满足更长的 HTTP 请求(比如 50MB 的下载文件)。另一个 HTTP 线程池将迎合相对较小的请求,如网页下载,diag reports stats etc.The 新创建的线程池很有意义,因为客户端请求占用了 HTTP 工作线程资源。客户端下载文件 (50MB) 所需的时间越长,HTTP 资源因拒绝其他 HTTP 请求而被绑定的时间就越长。我不在外部公开端口。 Apache proxy pass 负责将我的请求路由到适当的端口。
我想了解这种方法是否有任何 flaw/drawback。 我使用的 Glassfish 版本是 3.1.1 或 v3
编辑
添加我对以下回复的评论以使问题更加清晰
但是,我的问题是了解在一个虚拟服务器下创建多个线程池是否存在任何问题。我们通常为每个域(或虚拟服务器)创建一个线程池。通过在单个域中创建两个线程池(和侦听器)我是否违反了任何规定或这被认为是正常做法?
我发现这种方法的唯一警告是。假设我有两个端口 8080 和 8085 分配给网络侦听器。所有在8080上可以访问,也可以通过8085端口访问的请求,这是预期的吗?但这更多是从测试的角度来看,因为无论如何我都不会在外部公开我的端口。
考虑以下场景:
假设:您没有任何逻辑来确定传入 HTTP 请求的大小和路由到特定线程池。
- 为 html 页面和轻量级请求提供服务的线程池 A 有要处理的 HTTP 请求,我们可以说由于线程同步问题有一些延迟。在这种情况下,考虑到 ThreadpoolA 已满,请求被路由到 threadpoolB,它可能有一些容量,但可能需要很长时间才能完成其大型 HTTP 请求。这会导致阻塞线程,无论它们的紧急程度如何。
- 假设您正在使用循环法将传入的 HTTP 请求路由到特定的线程池。如果您在某个时间点有两个或几个传入的大型 HTTP 请求,则您的两个线程池都忙于处理大型请求和 blocking/delaying 轻量级 http 请求。
假设: 您有一个逻辑来确定 HTTP 请求的大小并路由到特定的线程池。这将需要您捕获有关线程池现在占用情况的一些统计信息,并根据每个线程池的剩余工作量路由 http 请求来充分利用它们。如果没有,您可能有一个专用线程池,它只处理大型 http 请求,但在特定大小的大型 http 请求到达之前一直处于空闲状态,没有任何利用率。另外,假设您已将大小设置为 >=10MB 以路由到 ThreadpoolB,将 <10MB 路由到 ThreadpoolA,如果您有意想不到的少量请求,那么问题会更糟,让我们说 9MB,这已经相当大并且仍然不断命中 ThreadpoolA而 ThreadpoolB 是免费的,并且会阻止较小的 HTTP 请求。因此,确定何时路由 HTTP 请求的理想大小也是实现最佳性能的关键决定因素,这完全取决于应用程序的工作负载特征。
我觉得你的做法很有道理。
作为替代方案,您可以使用 Servlet 3.0 异步请求处理功能,并决定是否要将 long/heavy 请求直接委托给 Glassfish 中的单独线程,而不是使用 Apache。