单EAR?还是多个EAR?

时间:2013-05-21 15:10:32

标签: java java-ee deployment scalability ear

我们正在开发基于JavaEE 6的应用程序,以部署在JBoss EAP 6.1上。该应用程序有2个主要的表示机制:Web管理控制台和RESTful服务API。在后端,管理控制台和RESTful服务API都依赖于一系列EJB来执行事务逻辑和POJO服务来检索数据。

所有这些不同层的性能和资源需求完全可能不同。 RESTful服务相当薄,完全没有状态,而管理控制台是有状态的,具有更多的交互功能(因此需要更多的内存和处理)。由于我们的EJB执行主要的事务性业务逻辑,因此它们需要比仅查询数据库的POJO数据服务更多的处理能力。

鉴于这样的设置,使用所有这些组件部署单个EAR(在群集配置中的多个应用程序服务器中)或将单个组件分解为单独的EAR会更有意义吗?我对单独的EAR的想法是,例如,如果我发现它们存在可伸缩性问题,我可以部署更多EJB服务实例,即使Web控制台(例如)正在扩展就好了。

鉴于每个层/组件的可扩展性不同,我应该采取什么方法?是否必须在EAR之间进行远程EJB调用的开销太高而无法考虑这样的模型?任何建议都非常感谢!

2 个答案:

答案 0 :(得分:5)

“Java EE”方式是将应用程序部署为群集上的单个EAR。我假设您正在使用从REST /管理控制台到EJB-s的本地接口调用。部署很简单,如果您不需要会话复制(可以使用粘性会话),那么可伸缩性将非常好。

您需要的唯一额外元素是Web应用程序的负载均衡器(例如,Apache服务器也会负责SSL解码,静态资源服务以及可能缓存的缓存请求)。

这种设置的唯一问题可能是重负载,例如EJB可能会占用大量服务器资源,因此Web应用程序的吞吐量将难以控制,并且可能受到EJB的严重影响。如果您使用粘性会话,则用户始终会被重定向到同一服务器,因此只要用户会话持续,就没有机会将某些用户移动到负载较小的服务器上。

因此,如果您计划高负载,那么将Web应用程序和EJB保存在单独的盒子(或虚拟机)上是有意义的,这样就可以更容易地识别瓶颈并更容易扩展需要的层。

对此的惩罚是:

  1. 远程调用EJB。但是JBoss 6具有相当高级的EJB池配置,所以它可能不是一个非常糟糕的问题。
  2. 由这些远程调用引起的网络流量(因此,如果您在EJB和Web层之间传递大量数据,则可能是一个问题)。

答案 1 :(得分:2)

支持Piotr的好评:

现在将它们捆绑在一起,如果将来真的有需要,只拆分

将Martin Fowler的First Law of Distributed Object Design: Don’t distribute your objects!视为一个很好的指导方针 - 如果你打算打破它,至少要有意识地去做,并满足真正的商业需求。