此问题的范围/背景: 我将开发一个基于Java / Java EE的分布式服务器端应用程序,它可以扩展(scale-up,而不是横向扩展)。
我的应用程序包含servlet,它利用多个分布式后端服务实例来处理客户端请求。如果我需要实现更高的吞吐量,我希望能够只是添加更多这些分布式服务的实例( JVM在同一台或另一台机器上)和(期望)看到吞吐量增加。
为实现这一目标,我想到了一个松散耦合的异步系统。 我以为我会使用Async Servlets(servlet 3.0)和一个应用程序管理的线程池,它将客户端请求放在JMS队列上,这些队列将被其中一个分布式服务实例选中并进行处理。可以使用JMS将响应中继回客户端,从服务实例到servlet容器中的响应线程。
然而,异步系统似乎(显然)比同步系统更复杂(例如:错误处理和错误中继到客户端,请求跟踪等)。我也担心设计/代码的未来可维护性。
因此,出现了一个问题同步执行此操作是否有意义,同时仍然保持分布式,可扩展且松散耦合? 如果答案是肯定的,那么请分享实现这一目标的可能方法(同时保持建设性的#39)。
如果我能以同步的方式做到这一点,那么它将简化整个系统。 我不想不必要地增加系统的复杂性。
(假设它有意义)我能想到的一个可能的实现是使用RMI。 例如:要注册的分布式服务实例的服务注册表,并使负载均衡器在所有可用实例之间分配RMI调用。但它感觉是一个老一代的解决方案。有没有更好的选择?
编辑: 关于这个问题范围的其他细节:
答案 0 :(得分:1)
松散耦合和分布与处理是同步还是异步无关。
通过可扩展性,问题更加复杂。在同步模型中,每个待处理请求都需要一个线程。如果您需要扩展到非常高的负载(例如,每个服务器数千个并发请求),异步模型可能会更好地扩展。然而,为了从中获益,从处理传入连接开始的整个处理需要以异步方式完成。没有必要将同步请求处理线程委托给异步线程池,并阻塞直到该线程池计算出结果 - 毕竟,请求线程也可以自己完成工作。
如果你需要返回一个响应,那么只要scalabity允许(我们通常会这样做),我就会进行同步请求处理。
编辑: 有许多方法可以与分布式后端服务器通信。您可能只是使用EJB(如果我没记错的话,在引擎盖下使用RMI)。或者,您可以在负载均衡器后面使用Web服务。