同步servlet处理对分布式服务器端应用程序是否有意义

时间:2013-04-17 19:45:58

标签: java java-ee servlets asynchronous synchronous

此问题的范围/背景: 我将开发一个基于Java / Java EE的分布式服务器端应用程序,它可以扩展(scale-up,而不是横向扩展)。

我的应用程序包含servlet,它利用多个分布式后端服务实例来处理客户端请求。如果我需要实现更高的吞吐量,我希望能够只是添加更多这些分布式服务的实例( JVM在同一台或另一台机器上)和(期望)看到吞吐量增加。

为实现这一目标,我想到了一个松散耦合的异步系统。 我以为我会使用Async Servlets(servlet 3.0)和一个应用程序管理的线程池,它将客户端请求放在JMS队列上,这些队列将被其中一个分布式服务实例选中并进行处理。可以使用JMS将响应中继回客户端,从服务实例到servlet容器中的响应线程。

然而,异步系统似乎(显然)比同步系统更复杂(例如:错误处理和错误中继到客户端,请求跟踪等)。我也担心设计/代码的未来可维护性。

因此,出现了一个问题同步执行此操作是否有意义,同时仍然保持分布式,可扩展且松散耦合? 如果答案是肯定的,那么请分享实现这一目标的可能方法(同时保持建设性的#39)。

如果我能以同步的方式做到这一点,那么它将简化整个系统。 我不想不必要地增加系统的复杂性。

(假设它有意义)我能想到的一个可能的实现是使用RMI。 例如:要注册的分布式服务实例的服务注册表,并使负载均衡器在所有可用实例之间分配RMI调用。但它感觉是一个老一代的解决方案。有没有更好的选择?

编辑: 关于这个问题范围的其他细节:

  • 客户端基于浏览器不要求异步 服务器端。
  • 我不需要服务器推送。
  • 在任何时候,我都不会有比流行的Web服务器(甚至是Apache)的max-worker-threads更多的未完成请求。
  • 由于上述原因,related question中提到的用例似乎不适用于我的场景。

1 个答案:

答案 0 :(得分:1)

松散耦合和分布与处理是同步还是异步无关。

通过可扩展性,问题更加复杂。在同步模型中,每个待处理请求都需要一个线程。如果您需要扩展到非常高的负载(例如,每个服务器数千个并发请求),异步模型可能会更好地扩展。然而,为了从中获益,从处理传入连接开始的整个处理需要以异步方式完成。没有必要将同步请求处理线程委托给异步线程池,并阻塞直到该线程池计算出结果 - 毕竟,请求线程也可以自己完成工作。

如果你需要返回一个响应,那么只要scalabity允许(我们通常会这样做),我就会进行同步请求处理。

编辑: 有许多方法可以与分布式后端服务器通信。您可能只是使用EJB(如果我没记错的话,在引擎盖下使用RMI)。或者,您可以在负载均衡器后面使用Web服务。