2011-08-17 35 views
4

我是新來的Java EE,我不知道如何實現一個特定的要求。大量的對象,分片和Java EE

我需要一大組(數百萬)維持一組規則和狀態併爲客戶端提供API的對象。這些對象中的每一個都很長壽。鑑於這些內容太多,我們可能需要將它們分散到多個虛擬機中,並使用RMI來訪問它們。

我的問題是,是否有Java EE方法來解決定位對象實例的問題,允許客戶端獲取對象的引用,而無需知道它所在的機器。

我知道JNDI,但我不確定註冊每個JNDI目錄中的對象是否合適。我是否需要編寫一個可以讓自己知道每個對象所屬VM的「Locator」庫?

+0

你有沒有考慮可行的解決方案,如[兵馬俑](http://www.terracotta.org)和[一致性](http://www.oracle.com/technetwork/middleware/coherence/overview/ index.html的)?或者,您是否有任何特定/法定要求排除此類解決方案? –

+0

@AlistairIsrael我對他們沒有任何反應,但他們似乎只是幫助對象中的數據分佈。計算時間也需要被分割。不過,這些解決方案*可能對分發註冊表非常有用。OTOH就像Hazelcast一樣,也是註冊表分配的簡單解決方案。 – Royce

+0

我可以發誓兵馬俑提供了透明的集羣,使它看起來像你的應用程序,它運行在一個巨大的JVM上。他們的網站現在還沒有說清楚他們仍然這樣做,或者,這可能就是[Terracotta DSO](http://www.terracotta.org/confluence/display/docs/Home)的全部內容。 –

回答

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

.... 
}