Newsgroup: it.comp.java
Titolo: Scalabilità RMI

ciao a tutti, volevo sapere se qualcuno di voi ha esperienza con progetti
RMI su larga scala. Vi riassumo in breve il nostro problema:
Scenario: 500 Client Java (Swing ) che si connettono a un server RMI, di cui
circa sempre 300 in contemporanea; ogni client ottiene oggetti, li usa e poi
li 'butta via' ma esiste sempre un oggetto per ogni client che viene
ottenuto all'inizo e distrutto solo quando l 'utente chiude l' applicazione.
Niente Application server, tuto gestito solo via RMI.
Ora, sembra che il server RMI Java non ce la faccia ad avere cosě tante
connessioni RMI attive nello stesso momento; pare ( e dico pare perchč si
sta indagando) che piů di tante non riesca a sopportarne.
Qualcuno di voi ha esperienze analoghe, e sa dirmi se quello che osserviamo
č vero, o se abbiamo sbagliato a fare i test? A me pare molto strano che
Java non riesca a sopportare 300 connessioni RMI contemporanee; allora che
lo hanno fatto a fare, solo per giocarci con una decina di client??
grazie e ciao.

 lo hanno fatto a fare, solo per giocarci con una decina di client??
Per le architetture enterprise esistono gli Enterprise JavaBeans.
RMI è una API enterprise, ma non è stata pensata per scalare in questo
senso. L'unica cosa che puoi fare è massimizzare la memoria per la VM, e
aggiungere hardware su quel server (scalabilità verticale). E poi però sei
arrivato. Con EJB, puoi permetterti di aggiungere macchine che operano in
cluster (scalabilità orizzontale).
Bye.
Luigi.

 cluster (scalabilità orizzontale).
grazie mille per la risposta, anche se era quello che non volevo sentirmi
dire :-)). Migrare a EJB per noi vorrebbe dire ripensare un milione e mezzo
di linee di codice.
Il nostro sistema permette la scalabilità, cioè possiamo fare in modo che i
client si connettano a server RMI in load balancing, ma prima volevamo
capire quanto può 'sopportare' ogni server, e il risultato ottenuto (circa
80-100 connessioni RMI su un Win NT 516 MB,java 1.3.1 prima che si schianti
tutto) è, secondo me, veramente deludente. In produzione avremo macchine SUN
toste, ma se stanno così le cose verrebbe dire richiedere 5-6 macchine, ed è
difficile che lo accettino. :-((
--------------------------------
Inviato via 
http://usenet.libero.it

 
Occhio che stai ponendo male i termini del problema, che specie su 
questioni di carico e' un errore capitale. :)
RMI e' un protocollo di remote procedure calling. Di per se non "supporta" 
granche' in termini di scalabilita', in bene o in male (a parte un paio di 
punti sulla distributed garbage collection che devono essere tenuti 
presenti da chi implementa il layer RMI).
Ci sono poi - appunto - *implementazioni* di RMI. Quella di sun (l'RMI 
registry, RMI-over-IIOP, etc) e' probabilmente tarata ad un certo livello 
di performance. Inoltre, di default (ma potrei sbagliarmi e non ho tempo di 
guardare) RMI usa JRMP. Dalla versione 1.3 di Java c'e' standard un ORB 
corba - e la possiblita' di usare RMI su IIOP. Di conseguenza, puoi: usare 
o costruire una diversa implementazione di RMI; usare direttamte l'ORB (o 
sostituirlo con uno piu' performante o con servizi CORBA (2.3) di load 
balancing e distribuzione di carico - non so se quello Sun ce li abbia); 
lasciare le cose come sono e mettere il load balancing davanti. Eccetera.
Ad esempio, la stragrande maggioranza dei container EJB usa RMI e RMI/IIOP 
come meccanismo di RPC.
Inoltre, scalabilita' effettiva non si ottiene solo con RPC - ma anche con 
servizi diversi - pooling, distribuzione delle transazioni, clustering, 
eccetera - che in ambito Java sono generalmente supportati da J2EE, non dal 
"solo" RMI.
Infine un sistema e' scalabile o meno _a prescindere_ dalla performance di 
un singolo nodo: l'importante e' che ci sia un meccanismo per aggiungere 
nodi, e la performance cresca piu' o meno linearmente (o meglio) con il 
numero di nodi. Al limite, un server RMI che accettasse _una_ connessione 
(ma fornisse quel meccanismo) sarebbe scalabilissimo (anche se costosetto 
;-). Ma appunto RMI non si occupa del punto, in bene o in male.
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun


Brevemente: ogni connessione RMI richiede fra 3/4 connessioni TCP, quindi puo' essere un
problema a livello di server. Puoi provare ad innalzare il limite dei socket apribili
contemporaneamente, sicuramente aiuta, ma su numeri cosi' grossi forse e' meglio cambiare
architettura o fare un po' di parallelismo sui server, cosa che ti aiuterebbe anche in
un'ottica di fault-tolerance.
Ciao,
    Bruno.
---
| Bruno Bossola 
| A Java Software Engineer :-)
| 
http://digilander.iol.it/bbossola
|
| Membro del JUG Torino - 
http://www.jugtorino.it
| 

Ah, prova anche ovviamente a lanciare diversi server sulla stessa macchina in processi
diversi.


 ha scritto:
comunque mi sa che ne potremmo parlare al caffè, visto che dovremmo lavorare
nello stesso posto :-))
(
paolo....@consulenti.csi.it
 - int. 9477)
