2012-06-22 11 views
7

Sto lavorando su una coppia client-server in cui il client con multithreading esegue migliaia di richiami del server al secondo e la prima priorità è ottenere una latenza minima. Il rendimento dovrebbe essere alto. Sia il client che il server sono scritti in Java, la semantica della comunicazione è abbastanza semplice (operazioni put/get).Libreria di rete Java leggera e a bassa latenza?

Qual è la migliore libreria/framework di rete Java per questi requisiti? Server come Tomacat/Jetty sembrano essere dei pesi massimi. Sto pensando a MINA o Netty, ma non sono sicuro che queste librerie asincrone forniranno una bassa latenza stabile sotto carico di lavoro pesante.

+0

Si sta parlando di "[..] client esegue migliaia di invocazioni". Hai davvero solo * uno * (o pochissimi clienti)? I framework basati su java nio (netty/mina) brillano quando gestiscono molti client (connessioni simultanee), ma ciò non significa necessariamente che questi client eseguano molte invocazioni. tomcat usa http, mentre mina/netty sono più orientati verso l'uso diretto di tcp. – MartinK

+0

Sì, ho solo alcune applicazioni client e ogni applicazione ha un numero relativamente piccolo di thread (~ 20). Quindi, un numero totale di connessioni non è estremamente alto. – user1128016

+0

Quasi tutte le librerie di rete non bloccanti producono molti rifiuti mentre gestiscono i messaggi. Diventa molto difficile essere in tempo reale quando si ha l'interferenza del GC. Ti suggerisco di dare un'occhiata a [CoralReactor] (http://www.coralblocks.com/index.php/category/coralreactor/), che produce zero rifiuti. – rdalmeida

risposta

1

Se hai bisogno di prestazioni e throughput ultra-elevati, ti consiglio di utilizzare socket raw (controlla Socket e ServerSocket - potrebbe esserci anche una versione nio). Questo ti libererà dal sovraccarico contenuto in HTTP e altri protocolli

+2

Socket e ServerSocket non sono "socket raw". Sono socket TCP. I socket grezzi non possono essere utilizzati da Java puro, – EJP

2

Ti suggerisco di provare il framework kryonet.

2

Se si desidera comunicare sulla stessa macchina, è possibile provare qualcosa come Java Chronicle che può supportare oltre un milione di messaggi persistenti al secondo con tempi di sottotitoli di secondo-microsecondo.

Se si desidera una bassa latenza tra le macchine, è necessario osservare con molta attenzione il proprio hardware. Per l'hardware di base, la latenza del round round sarà di 100 micro secondi per più. Con l'hardware specializzato, sei più vicino a 20 micro secondi.

Oppure è possibile comunicare sulla stessa casella e ottenere latenze molto inferiori. ;)

2

Puoi provare anche a Jocket. Condivide alcuni concetti con Java Chronicle ma è diretto direttamente a sostituire l'implementazione Socket standard.

La latenza RTT è inferiore al microsecondo per un ping-pong tra i processi.