我们正在开发基于Java EE的应用程序。我们的应用程序与Java 1.5兼容,并将使用EBJ 3.0和Web服务功能包部署到WAS ND 6.1.0.21。配置当前是一个具有两个集群的单元。每个群集将有两个节点。
我们的应用程序或我们的系统应该分为两个或三个部分。
第1部分:部署到一个群集的耳朵,其中包含第三方供应商代码以及自定义代码。他们的代码符合EJB 2.0,并且有很多Remote Home接口。
第2部分:与第一只耳朵部署在同一群集中的耳朵。这个耳朵包含EBJ 3,它可以调用供应商提供的EJB 2和自定义代码。这些EJB 3也被与EAR一起打包的JSF UI使用,其中一些也作为Web服务(符合SOAP 1.2的JAX-WS 2.0)公开给其他客户端。
第3部分:可能有其他服务不依赖于我们的供应商/自定义代码应用程序。这些服务将是EJB 3.0和部署到其他集群的Web服务。
根据网站上一些IBM员工的建议,集群中节点之间的通信可以是EJB RMI。但是,如果我们跨越集群和/或其他单元,那么通信应该是Web服务。
也就是说,我们中的一些人对于使用我们的Web服务和EJB的应用程序的速度感到疑惑,并且正在考虑性能和优化通信。现在大多数EJB都是暴露的。 (我们的供应商以这种方式设置他们,而不是暴露本地家庭接口)。我们想知道WAS是否在同一节点/集群节点空间中的应用程序之间进行了任何优化。如果两个应用程序安装在同一区域并且它们通过远程家庭接口相互呼叫,那么WAS是否足够聪明以使其成为本地家庭接口呼叫?
他们的其他优化技巧是什么?我们应该考虑一下吗?我们不应该吗?成本/收益是多少?以下是我们的一位团队成员在其电子邮件中发送的问题:
问题是:假设我们将EJB作为远程EJB开发,我们的UI控制器代码通过EJB3与我们的EXT Java服务进行通信...当EJB服务器和客户端都在运行时,我们的性能优化选择是什么?同一个容器?</ p>
作为一个参考点,谷歌从2000年开始给了我一些oooooold websphere性能调优文档,它解释了一个调优配置,你可以将它设置为当它们位于同一个应用服务器JVM时为EJB通信启用Call By Reference。它陈述如下:
因为EJB本质上与位置无关,所以它们使用远程编程 模型。方法参数和返回值通过RMI-IIOP序列化并返回 按价值。这是内在的RMI“按值调用”模型。
WebSphere为运行EJB提供了“No Local Copies”性能优化 和同一应用程序服务器JVM中的客户端(通常是servlet)。 “没有地方 复制“选项使用”按引用调用“并且不会为被调用创建本地代理 客户端和远程对象在同一进程中的对象。根据 在您的工作量上,这可以节省大量的开销。
通过添加以下两个命令行参数来配置“无本地副本” 应用程序服务器JVM:
* -Djavax.rmi.CORBA.UtilClass=com.ibm.CORBA.iiop.Util
* -Dcom.ibm.CORBA.iiop.noLocalCopies=true
注意:“No Local Copies”配置选项可提高性能 对同一JVM中的客户端和EJB,将“按值调用”更改为“按引用调用”。 这样做的一个副作用是Java对象派生(非原始)方法参数 实际上可以被被调用的企业bean更改。考虑图16a:
此外,我们将来也将使用Process Server 6.2和WESB 6.2。有任何想法吗?建议?
由于
答案 0 :(得分:2)
唯一可以为远程EJB实现的自动优化是它们是否共存(从同一JVM中访问)。在这种情况下,如果请求需要跨越线路,ORB将使一些工作短路。仍然会有一些必要的ORB开销,包括对象序列化(除非你打开noLocalCopies,它带来了所有警告)。
或者,如果您知道UI控制器是共处的,那么您的方法调用不依赖于参数或返回值复制,并且您的接口不依赖于本地视图和远程视图之间的异常差异,那么您可以创建和公开本地子接口比通过ORB远程访问快得多。
答案 1 :(得分:1)