Domanda

Ho visto la domanda: La comunicazione tra due applicazioni separate Java Desktop (risposta: JGroups) e sto pensando di implementare qualcosa con JavaGroups o dritto RMI ma la velocità è l'essenza. Non sto invio di grandi quantità di dati in tutto (il contenuto dei messaggi MIDI, in modo da 3 byte ciascuno, non più di dire due messaggi ogni tre millisecondi) e questo sarà tutto sulla stessa macchina. E 'stupido pensare che RMI / JGroups sulla stessa macchina fisica sarà lenta?

(Il mio pensiero è che io non posso permettermi più di 1 ms della latenza, dal momento che ho già avuto qualche, ma non sono sicuro di come meglio parlare di velocità in questo contesto.)

Credo che la mia vera domanda è:? ci sono tutte le opzioni per la comunicazione InterApp in Java che passano attraverso qualcosa di più veloce di TCP / IP Voglio dire cose già realizzate in Java, possibilità non JNI che ho' d necessario implementare:)

Lo so, non ottimizzare presto e tutto questo, ma anche meglio prevenire che curare.

È stato utile?

Soluzione

  

ci sono tutte le opzioni per la comunicazione InterApp in Java che passano attraverso qualcosa di più veloce di TCP / IP?

Non significativamente ... per quanto ne so.

Ma penso che si sta pensando a questo modo sbagliato. Supponendo che si sta spostando piccoli messaggi, il killer prestazione principale saranno le spese generali di effettuare una chiamata piuttosto che la velocità con cui vengono spostati byte. Queste spese includono cose come il tempo necessario per effettuare chiamate di sistema, per accendere i contesti di processo sul lato client e server, per elaborare le intestazioni dei pacchetti messaggio all'interno del kernel e di instradare i pacchetti. E qualsiasi interazione sincrona RPC simile comporta effettuare una chiamata di attesa della risposta; vale a dire l'applicazione -> Server -> tempo di andata e ritorno.

Il modo per ottenere una maggiore produttività è quello di concentrarsi su quanto segue:

  • ridurre il numero di RPC che l'applicazione richiede; per esempio. combinando loro di essere più grossolano, e

  • alla ricerca di modi per trasformare le interazioni sincrone in interazioni asincrone; per esempio. usando il messaggio basa invece di tecnologie basate RPC.

Altri suggerimenti

Se la velocità è l'essenza, si dovrebbe fare la chiamata nello stesso thread. Non sarà possibile ottenere veloce come questo utilizzando una rete.

Tuttavia, supponendo che la velocità non è abbastanza importante che è possibile eseguire Java RMI chiamate in circa 500 micro-secondi e utilizzando RPC in codice personalizzato è possibile effettuare chiamate oltre loopback in circa 24 microsecondi. Anche il passaggio di dati tra i thread nella stessa JVM può prendere 8 microsecondi.

È necessario decidere quanto tempo siete disposti a permettere di effettuare una chiamata di rete. È inoltre necessario decidere se il momento di iniziare la chiamata è critico o il tempo per restituire un risultato. (Spesso quest'ultimo ha il doppio della testa)

Nota: sto parlando micro-secondo qui, non milli-secondi. Vorrei ignorare eventuali opzioni che prendono più millisecondi per i vostri scopi.

Questo benchmark è circa due anni vecchio, ma dimostra che l'unica soluzione Java remoting popolare più veloce di RMI è dell'Assia 2 (che è ancora in beta credo).

Tuttavia, se i messaggi sono solo in byte cifra singola, utilizzando qualsiasi soluzione di servizi remoti sembra eccessivo, soprattutto se i processi sono sulla stessa macchina. Mi consiglia loro consolidamento in un unico processo, se possibile. Si potrebbe anche prendere in considerazione solo utilizzando Plain Old Java socket .

  

E 'stupido pensare che RMI / JGroups sulla stessa macchina fisica sarà lenta?

Se la macchina è decente probabilmente sì :) Se si esegue su una macchina con tonnellate di processi alimentari, ecc CPU allora le cose potrebbero essere diverse. Come sempre il modo migliore per scoprire se si verificano la stessa cosa di me è per testarlo.

Il seguente è il tempo in millisecondi taken utilizzando nanoTime nella stessa JVM per inviare la stringa "123" usando RMI e sul server concat con "abc" per ottenere "123abc" e restituirlo.

Freddo JVM: circa 0,25 millisecondi di latenza

0.250344
0.262695
0.241540
0.282461
0.301057
0.307938
0.282102

JVM caldo:. Circa la latenza 0,07 millisecondi

0.87916
0.72474
0.73399
0.64692
0.62488
0.59958
0.59814
0.66389

Quindi, si sarebbe ben entro 1 millisecondo se il server RMI e il client è in esecuzione in locale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top