大量对象、分片和Java EE

4
我刚接触Java EE,不确定如何实现特定需求。
我需要一个大量的对象集合(数百万个),这些对象维护一堆规则和状态,并为客户端提供API。每个对象都有很长的生命周期。考虑到这么多对象,我们可能需要将它们分片到许多虚拟机中,并使用RMI来访问它们。
我的问题是是否有Java EE方法来解决查找对象实例的问题,允许客户端获取对象引用而无需知道它位于哪台机器上。
我知道JNDI,但我不确定在JNDI目录中注册每个对象是否合适。我需要编写一个“定位器”库,可以了解每个对象所属的虚拟机吗?

你是否考虑过可用的解决方案,例如TerracottaCoherence?或者,你是否有任何特定/法定要求排除这些解决方案? - Alistair A. Israel
@AlistairIsrael 我对它们没有任何意见,但是它们似乎只能帮助对象中的数据分发。计算时间也需要进行分片。这些解决方案可能对于分发注册表很有用。另一方面,像Hazelcast这样的解决方案也可以简单地用于注册表分发。 - Royce
我曾经以为Terracotta提供了透明的集群,使得你的应用程序看起来像在一个巨大的JVM上运行。他们的网站现在并没有明确表明他们是否仍然这样做,或者也许这就是Terracotta DSO所关注的内容。 - Alistair A. Israel
2个回答

2
没有更具体的细节,让我尝试提出几个探索方向。
如果我理解您的意思正确,您想要的是类似于DHT的东西,但用于托管和查找对象(代码+数据)或服务节点,而不仅仅是原始数据。我不知道是否有这样的平台,但它肯定听起来像一个有趣的想法。
Java EE本身(作为规范)并没有为我认为您正在寻找的大规模分布式集群和分片提供“开箱即用”的解决方案。
Glassfish(Java EE RI)本身使用Shoal作为集群框架,可以使用GrizzlyJGroups作为底层组通信平台。
所以,在您的情况下,我会考虑构建和扩展JGroups进行组通信。然后,我们不再依赖于中央注册表,而是依靠DHT进行服务/对象定位。看看现有的成功的基于DHT的平台(如memcached、Apache Cassandra)如何实现分区和查找、容错和故障转移,然后只需调整/采用这些方法即可。然后,您可以使用RMI/RPC进行客户端-服务器(服务节点)调用。
希望我说得清楚,祝好运!如果您自己推出这个项目,请考虑开源它。;)

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;
    }

....
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接