3

我正在构建一个具有性能和可扩展性的 JEE6 应用程序。

业务逻辑和 JPA2 外观保存在无状态会话 bean (EJB3.1) 中。截至目前,SLSB @Remote实现-interfaces。当一个 bean 需要访问另一个 bean 时,它通过 RMI 来完成。

我对此的推理是假设,一旦应用程序在一堆集群应用程序服务器上运行,RMI 部分允许执行自动分布在整个集群中。

这是一个正确的假设吗?

我可以处理它的缺点(对象丢失 entityManager 会话,按值传递),至少我是这么认为的。但我想知道持续的远程调用是否不会增加必要的负载。

4

1 回答 1

3

EJB 规范没有指定应该如何实现集群,因此这将取决于所使用的特定实现。实际上,EJB 规范的目的是为了不对部署做出假设:它们不要求对集群提供任何支持,而是以一种使其成为可能的方式编写的(并且 EJB 模型中的许多限制源于潜在的集群问题,例如对文件系统的访问)。然后实现者可以自由地支持或不支持集群,并且仍然遵守规范。

在 Glassfish 中,对远程 EJB 的引用执行分发本身。有关更多信息,请参阅我的答案。每个请求都可能被分派到不同的节点。这可能是大多数实现的工作方式。所以我会说你的假​​设是正确的。

然而,我确实希望他们优化当一个 EJB 调用另一个 EJB 并尽可能尝试在同一个节点上调度 invacation 的情况。这将取决于部署是否是同构的(所有节点是否具有相同的 bean)。同样,规范对于这些点有点含糊。但我猜大多数部署在实践中是同质的:同一个耳朵部署在所有节点上。

关于远程与本地调用的性能开销,我曾经做过一些测量(在 Glassfish 上)。在这里查看我的答案。通过远程接口在同一个 .ear 中的 EJB 间调用比本地调用慢 3 倍。这听起来很大,但我们说的是毫秒,所以相对开销取决于方法的实际作用。我不知道其他应用程序的性能。服务器。

希望能帮助到你。

于 2010-05-05T08:01:56.463 回答