Pregunta

He visto la pregunta: La comunicación entre dos aplicaciones separadas de escritorio Java (respuesta: JGroups) y estoy pensando acerca de cómo implementar algo con JavaGroups o RMI recta, pero la velocidad es de la esencia. No estoy enviando grandes cantidades de datos en torno a (contenido de los mensajes MIDI, por lo 3 bytes cada uno, no más que decir dos mensajes cada tres milisegundos) y este será todo en la misma máquina. ¿Es tonto pensar que RMI / JGroups en la misma máquina física será lento?

(Mi pensamiento es que no me puedo permitir más de 1 ms de latencia, ya que ya tengo algunos, pero no estoy seguro de cuál es la mejor hablar de velocidad en este contexto.)

Creo que mi verdadera pregunta es:? ¿hay opciones para la comunicación InterApp en Java que pasan por algo más rápido que TCP / IP me refiero a cosas ya implementados en Java, posibilidades no JNI que yo' d necesitará implementar:)

Lo sé, no optimizan temprano y todo eso, pero también es mejor prevenir que curar.

¿Fue útil?

Solución

  

¿hay opciones para la comunicación InterApp en Java que pasan por algo más rápido que TCP / IP?

No es significativamente ... que yo sepa.

Pero creo que usted está pensando en esto por el camino equivocado. Suponiendo que se están moviendo mensajes pequeños, el principal asesino de actuación será los gastos generales de hacer una llamada en lugar de la velocidad con que se mueven bytes. Estos gastos incluyen cosas tales como el tiempo necesario para hacer llamadas al sistema, para cambiar contextos proceso del lado del cliente y el servidor, para procesar cabeceras de los paquetes de mensajes dentro del núcleo y encaminar los paquetes. Y cualquier interacción sincrónica RPC-como implica hacer una llamada de una espera de la respuesta; es decir, la aplicación -> Servidor -> tiempo de ida y vuelta.

La forma de obtener un mayor rendimiento es centrarse en lo siguiente:

  • reducir el número de RPC que la aplicación requiere; p.ej. mediante la combinación de ellos para ser más de grano grueso, y

  • buscando la manera de convertir las interacciones sincrónicas en las interacciones asincrónicas; p.ej. el uso de mensajes basado en lugar de las tecnologías basadas en RPC.

Otros consejos

Si la velocidad es de la esencia, usted debe hacer la llamada en el mismo hilo. Usted no recibirá más rápido que esto usando una red.

Sin embargo, suponiendo que la velocidad no es tan importante que puede realizar llamadas de Java RMI en aproximadamente 500 microsegundos y el uso de RPC código personalizado que puede realizar llamadas a través de bucle de retorno de aproximadamente 24 microsegundos. Incluso pasar datos entre hilos en la misma JVM puede tomar 8 micro-segundos.

Es necesario decidir cuánto tiempo están dispuestos a permitir que para realizar una llamada a la red. También es necesario decidir si el tiempo para iniciar la llamada es crítico o el tiempo para devolver un resultado. (A menudo, el último tiene el doble de la sobrecarga)

Nota: estoy hablando de micro-segundos aquí, no mili-segundos. Me ignorar cualquier opción que tienen varios milisegundos para sus propósitos.

Este punto de referencia es unos dos años viejo, pero muestra que la única solución interacción remota de Java RMI populares más rápido que se de Hesse 2 (que todavía está en creo beta).

Sin embargo, si sus mensajes son sólo en bytes de un solo dígito, utilizando cualquier solución de comunicación remota parece un exceso, especialmente si los procesos están en la misma máquina. Me gustaría recomendar consolidarlos en un solo proceso, si es posible. También podría considerar simplemente usando viejo y simple de Java sockets .

  

¿Es tonto pensar que RMI / JGroups en la misma máquina física será lento?

Si la máquina es decente probablemente sí :) Si se está ejecutando en una máquina con un montón de procesos alimentarios CPU, etc, entonces las cosas podrían ser diferentes. Como siempre la mejor manera de saber si usted experimenta lo mismo que yo es para probarlo.

El siguiente es el tiempo en milisegundos tomada usando nanoTime en la misma JVM para enviar la cadena "123" utilizando RMI y en el servidor concat con "abc" para obtener "123abc" y devolverlo.

Cold JVM: Aproximadamente 0,25 milisegundos de latencia

0.250344
0.262695
0.241540
0.282461
0.301057
0.307938
0.282102

JVM caliente: Aprox. 0,07 milisegundos de latencia

0.87916
0.72474
0.73399
0.64692
0.62488
0.59958
0.59814
0.66389

Así que estaría bien dentro de 1 milisegundo si el servidor y el cliente RMI se ejecuta localmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top