4

我是 java ee 的新手,我不确定如何实现特定的要求。

我需要一大组(数百万)对象来维护一堆规则和状态,并为客户端提供一个 API。这些对象中的每一个都是长寿的。鉴于这些东西太多了,我们可能需要将它们分片到许多 VM 上,并使用 RMI 来访问它们。

我的问题是是否有 Java EE 方法来解决定位对象实例的问题,允许客户端获取对对象的引用而无需知道它在哪台机器上。

我知道 JNDI,但我不确定在 JNDI 目录中注册每个对象是否合适。我是否需要编写一个“定位器”库来让自己知道每个对象所属的虚拟机?

4

2 回答 2

2

没有更具体的细节,让我冒险探索几种途径。

如果我没看错的话,你想要的是类似于DHT的东西,但用于托管和查找对象(代码+数据)或服务节点,而不仅仅是原始数据。我不知道有任何这样的平台,尽管这听起来确实是一个有趣的想法。

Java EE 本身(作为规范)没有指定,参考实现也没有为我认为您正在寻找的大规模分布式集群和分片提供“开箱即用”的解决方案。

Glassfish(Java EE RI)本身使用Shoal作为集群框架,可以使用GrizzlyJGroups作为底层组通信平台。

因此,在您的特定情况下,我会考虑构建并基于 JGroups 进行群组通信。然后,我们依靠 DHT 来定位服务/对象,而不是中央注册表。看看现有的、成功的基于 DHT 的平台(memcached、Apache Cassandra)如何实现分区和查找、容错和故障转移,然后调整/采用这些。然后,您可以将 RMI/RPC 用于客户端-服务器(服务节点)调用。

希望我是有道理的,祝你好运!如果你自己推出这个,看看你是否可以开源它。;)

于 2011-08-17T06:08:47.470 回答
0

我可能不会直接回答您的问题,但我知道 Oracle Coherence 不仅可以分发数据,还可以分发针对该数据的计算。

简单的示例代码在这里。您通过实现 com.tangosol.uti.InvocableMap.EntryProcessor 的类编写计算。这将使计算能够在数据所在的服务器上进行。一个限制是数据需要可序列化,因为它通过网络移动。

public class CalcLogic implements EntryProcessor {
....
    //InvocableMap.Entry is the "data"
    //You write your calculation in this process methods.
    public Object process(InvocableMap.Entry entry {
        (YourObjectType) obj = (YourObjectType)entry.getValue();
        //do some calculation against obj here
        entry.setValue(obj);   
        return null;
    }

....
}
于 2011-08-18T00:53:16.270 回答