2012-06-22 31 views
7

Estoy trabajando en un par cliente-servidor donde el cliente multiproceso realiza miles de invocaciones del servidor por segundo y la primera prioridad es lograr una latencia mínima. El rendimiento también debería ser alto. Tanto el cliente como el servidor están escritos en Java, la semántica de comunicación es bastante simple (operaciones put/get).¿Biblioteca de red Java liviana y de baja latencia?

¿Cuál es la mejor biblioteca/marco de red Java para estos requisitos? Los servidores como Tomacat/Jetty parecen ser pesados. Estoy pensando en MINA o Netty, pero no estoy seguro de que estas bibliotecas asíncronas proporcionen una baja latencia estable bajo una gran carga de trabajo.

+0

Estás hablando de "el cliente [..] realiza miles de invocaciones". ¿De verdad solo tienes * one * (o muy pocos clientes)? Los marcos basados ​​en java nio (netty/mina) brillan cuando manejan muchos clientes (conexiones simultáneas), pero eso no significa necesariamente que estos clientes realicen muchas invocaciones. tomcat usa http, mientras que mina/netty está más orientado al uso de tcp directamente. – MartinK

+0

Sí, tengo solo unas pocas aplicaciones cliente y cada aplicación tiene un número relativamente pequeño de subprocesos (~ 20). Entonces, un número total de conexiones no es extremadamente alto. – user1128016

+0

Casi todas las bibliotecas de red sin bloqueo producen una gran cantidad de basura mientras manejan los mensajes. Se vuelve muy difícil estar en tiempo real cuando tienes la interferencia del GC. Sugiero que echen un vistazo a [CoralReactor] (http://www.coralblocks.com/index.php/category/coralreactor/), que produce cero basura. – rdalmeida

Respuesta

1

Si necesita rendimiento y rendimiento ultraelevado, le recomiendo que use conectores sin formato (consulte Socket y ServerSocket, también puede haber una versión nio). Esto lo liberará de la sobrecarga contenida en HTTP y otros protocolos

+2

Socket y ServerSocket no son 'sockets sin formato'. Son sockets TCP. Los sockets crudos no se pueden usar de Java puro, – EJP

2

Le sugiero que pruebe el marco kryonet.

2

Si desea comunicarse en la misma máquina, puede intentar algo como Java Chronicle que puede admitir más de un millón de mensajes persistentes por segundo con tiempos de viaje de ida y vuelta de menos de un microsegundo.

Si desea baja latencia entre las máquinas, debe prestar mucha atención a su hardware. Para hardware básico, la latencia de ida y vuelta será de 100 microsegundos por más. Con hardware especializado, estás buscando más cerca de 20 microsegundos.

O puede comunicarse en la misma caja y obtener latencias mucho más bajas. ;)

2

También puedes probar Jocket. Comparte algunos conceptos con Java Chronicle, pero está directamente dirigido a reemplazar la implementación estándar de Socket.

La latencia de RTT es inferior al microsegundo para un ping-pong entre procesos.

Cuestiones relacionadas