2011-08-17 8 views
4

Je suis nouveau à Java ee et je ne suis pas sûr de savoir comment mettre en œuvre une exigence particulière.Nombre énorme d'objets, sharding et java EE

J'ai besoin d'un grand ensemble (millions) d'objets qui maintiennent un tas de règles et d'état et présentent une API pour les clients. Chacun de ces objets a une longue durée de vie. Étant donné qu'il y en a tellement, nous aurons probablement besoin de les partager entre plusieurs machines virtuelles et d'utiliser RMI pour y accéder. Ma question est de savoir s'il existe une approche Java EE pour résoudre le problème de localisation d'une instance de l'objet, permettant aux clients d'obtenir une référence à l'objet sans avoir besoin de savoir sur quelle machine il se trouve.

Je suis conscient de JNDI, mais je ne suis pas sûr que l'enregistrement de chacun des objets dans un répertoire JNDI est approprié. Ai-je besoin d'écrire une bibliothèque "Locator" qui peut se rendre compte de la VM à laquelle appartient chaque objet?

+0

Avez-vous envisagé des solutions disponibles, telles que [Terre cuite] (http://www.terracotta.org) et [Cohérence] (http://www.oracle.com/technetwork/middleware/coherence/overview/ index.html)? Ou avez-vous des exigences spécifiques/statutaires qui empêchent de telles solutions? –

+0

@AlistairIsrael Je n'ai rien contre eux, mais ils semblent seulement aider à la distribution des données dans les objets. Le temps de calcul doit également être partagé. Ces solutions * pourraient toutefois être utiles pour la distribution du registre.OTOH quelque chose comme Hazelcast serait une solution simple pour la distribution du registre aussi. – Royce

+0

J'ai juré que Terracotta offrait un clustering transparent qui donnait à votre application l'impression qu'elle fonctionnait sur une énorme JVM. Leur site Web ne précise pas maintenant qu'ils le font encore, ou peut-être que c'est ce que [Terracotta DSO] (http://www.terracotta.org/confluence/display/docs/Home) est tout. –

Répondre

2

Sans plus de détails spécifiques, laissez-moi vous présenter plusieurs pistes d'exploration. Si je vous lis correctement, ce que vous voulez est quelque chose comme DHT mais pour héberger et rechercher des objets (code + données) ou des nœuds de service, pas seulement des données brutes. Je ne suis pas au courant d'une telle plate-forme, même si cela semble vraiment une idée intéressante. Java EE lui-même (en tant que spécification) ne spécifie pas, et l'implémentation de référence ne fournit pas une solution "prête à l'emploi" pour le clustering massivement distribué & sharding Je pense que vous recherchez.

Glassfish (Java EE RI) utilise lui-même Shoal comme infrastructure de clustering, qui peut utiliser Grizzly ou JGroups comme plate-forme de communication de groupe sous-jacente. Donc, dans votre cas particulier, je chercherais à construire et sur JGroups pour les communications de groupe. Ensuite, au lieu d'un registre central, nous comptons sur DHT pour l'emplacement du service/de l'objet. Regardez comment les plates-formes DHT existantes et efficaces (memcached, Apache Cassandra) implémentent la recherche par partitionnement, la tolérance aux pannes et le basculement, et adaptez-les simplement. Vous pouvez ensuite utiliser RMI/RPC pour les invocations client-serveur (nœud de service).

J'espère que j'ai du sens, et bonne chance! Si vous le faites vous-même, voyez si vous pouvez l'ouvrir. ;)

0

Je ne peux pas directement répondre à votre question, mais je sais que Oracle Coherence ne peut pas simplement distribuer des données, mais peut également distribuer le calcul contre ces données.

Exemple de code simple ici. Vous écrivez votre calcul dans une classe qui implémente com.tangosol.uti.InvocableMap.EntryProcessor. Cela permettra au calcul d'avoir lieu sur le serveur où les données existent. Une réparation est que les données doivent être sérialisables car il se déplace à travers le réseau.

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

.... 
}