我是java ee的新手,我不确定如何实现特定的要求。
我需要一大堆(数百万)对象来维护一堆规则和状态,并为客户提供API。这些对象中的每一个都是长寿的。鉴于有这么多东西,我们可能需要在许多虚拟机上对它们进行分片并使用RMI来访问它们。
我的问题是,是否有一种Java EE方法可以解决定位对象实例的问题,允许客户端获取对象的引用,而无需知道它所在的机器。
我知道JNDI,但我不确定在JNDI目录中注册每个对象是否合适。我是否需要编写一个“定位器”库,使自己能够了解每个对象所属的VM?
答案 0 :(得分:2)
如果没有更具体的细节,让我冒险探索几条途径。
如果我正确地读你,你想要的东西类似于DHT,但是用于托管和查找对象(代码+数据)或服务节点,而不仅仅是原始数据。我不知道任何这样的平台,虽然它听起来确实是一个有趣的想法。
Java EE本身(作为规范)没有指定,参考实现也没有为大规模分布式群集提供“开箱即用”的解决方案。我认为你正在寻找分片。
Glassfish(Java EE RI)本身使用Shoal作为集群框架,可以使用Grizzly或JGroups作为底层组通信平台。
因此,在您的特定情况下,我会考虑构建和JGroups进行群组通信。然后,我们依靠DHT来代替服务/对象位置,而不是中央注册表。看看现有的,成功的基于DHT的平台(memcached,Apache Cassandra)如何实现分区&查找,容错和故障转移,只是适应/采用这些。然后,您可以使用RMI / RPC进行客户端 - 服务器(服务节点)调用。
希望我有意义,祝你好运!如果你自己推出它,看看你是否可以开源。 ;)
答案 1 :(得分: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;
}
....
}