8

Tenemos un gran sistema de software de alto rendimiento que consta de múltiples procesos de Java que interactúan (no EJB). Cada proceso puede estar en la misma máquina o en una máquina diferente.¿Existe una solución de sincronización de reloj lista para usar para Java?

Ciertos eventos se generan en un proceso, y luego se propagan de diferentes maneras a otros procesos para su posterior procesamiento, y así sucesivamente.

Para la evaluación comparativa, necesitamos crear un registro de cuándo cada evento pasó por un "punto de control", eventualmente combinar estos registros para obtener una línea de tiempo de cómo cada evento se propagó a través del sistema y con qué latencia (por supuesto, proceso conmutación y IPC agrega latencia, lo cual está bien).

El problema, por supuesto, es la sincronización del reloj. Así que aquí están mis preguntas:

1) Si todos los procesos están en la misma máquina, ¿se garantiza que currentTimeMilis sería precisa en el momento de la llamada? ¿Hay algún límite en los errores de ITP?

2) Si algunos procesos pueden estar en máquinas diferentes, ¿existe una solución lista para usar (que también sea gratuita o de código abierto) para la sincronización del reloj? Prefiero buscar una solución que pueda eludir el sistema operativo (Windows o Linux) y trabajar directamente desde Java. También estoy idealmente buscando algo que pueda operar con una precisión de microsegundos. He pensado en NTP, pero no estoy seguro si está disponible a través de Java en lugar de a través del sistema operativo, y no estoy seguro de su complejidad.

3) ¿Hay alguna manera de determinar el margen de error al usar NTP en una configuración particular (o de cualquier solución que termine usando) para poder dar un margen de error en nuestro cálculo de la latencia?

Gracias!

Respuesta

4

Con la programación distribuida, la sincronización del reloj a menudo no es suficiente. es posible que desee construir un marco de tiempo lógico (como el Lamport o los relojes vectoriales o los métodos de Singhal-Kshemkalyani ... y hay muchos más para mantener la causalidad sincronizada en todas las máquinas). El que elija a menudo depende de la aplicación y la causalidad requerida entre los eventos.

Los relojes se sincronizan para garantizar que los eventos concurrentes se mantengan en el orden secuencial correcto. Hay otras maneras de hacerlo que manteniendo sincronizado el reloj del sistema ... que a menos que compartan un reloj físico común ... es bastante complicado.

En términos de margen de error NTP, hay soluciones:

mi recomendación:

Leer: Distributed Computing: Principios, Algoritmos y Sistemas

Especialmente: Capítulo 3, tiempo lógico

Editar

En relación con el puesto de Cheeso, encontré

http://www.uniforum.org/publications/ufm/apr96/opengroup.html

http://sourceforge.net/projects/freedce

Hay quizá fijaciones DCE Java por ahí.

+0

Recuerdo el libro de la universidad. Nuestro proyecto en este momento está buscando algo rápido y razonablemente preciso, no podemos ser las primeras personas en necesitar algo como esto. Me preguntaba si hay una implementación disponible. – Uri

+0

No es que yo sepa, pero con JVM habrá muchas latencias. El entorno del programa no está muy acoplado y puede bloquearse (en GC, etc.). No soy un experto en Java sin embargo. –

0

El antiguo DCE ("Distributed Computing Environment") solía tener una solución de sincronización de tiempo distribuido, con todas esas capacidades. Se llamaba DTS. El administrador podría configurar el conjunto de máquinas para sincronizar, y la latencia o incertidumbre se calculó y estuvo disponible. Si alguna máquina se desincronizaba, el reloj se ajustaba lentamente hasta que estaba sincronizada de nuevo. Había una garantía de que el tiempo en cualquier máquina nunca se ajustaría hacia atrás (en violación de la física básica). La red necesitaba al menos una entrada NTP para mantenerse sincronizado con "el mundo real".

No sé qué pasó con ese sincronizador de tiempo, o el código DCE en general.

Me parece que no necesita una solución "en Java". Necesita sincronizar los relojes de un conjunto de máquinas distribuidas. La aplicación Java es justamente lo que se ejecuta en las máquinas.

+0

Según entendí, la mayoría de los sistemas operativos usan un método de sincronización con un alto margen de errores (alrededor de 10-100 ms), lo cual es aceptable para la mayoría de las prácticas. Estaba pensando en hacerlo a través de Java, ya que puedo usar un servicio con mayor precisión. – Uri

+0

@ Cheeso - DCE estaba adelantado a su tiempo :) –

+0

@Uri - sí, veo que quiere una solución de mayor precisión. Solo quiero decir que es posible sincronizar independientemente de cualquier código Java. Es posible factorizar por completo la parte de sincronización de tiempo de la aplicación Java, de modo que una suposición de diseño en la aplicación Java es que "el tiempo está sincronizado". ¡Pero esa elección de diseño es suya! b – Cheeso

2

Realmente usaría NTP. Es bastante preciso incluso a través de Internet, y en una LAN debería ser incluso mejor. De acuerdo a Wikipedia [1],

NTPv4 por lo general puede mantener una precisión de unos 10 milisegundos (1/100 s) a través de la Internet pública, y puede alcanzar una precisión de 200 microsegundos (1/5000 s) o mejor en redes de área local bajo condiciones ideales.

por lo que puede ser suficiente para sus necesidades si sus condiciones son "ideales" suficiente. NTP ha existido lo suficiente como para que casi todo funcione. No veo ninguna razón para hacer esto a través de Java en lugar del sistema operativo. Si el sistema operativo está sincronizado, también lo será Java.

[1] Wikipedia: Network Time Protocol

1

me encontré con este hilo después de probar algo por mi cuenta (debería haber buscado primero!) http://snippets.dzone.com/posts/show/11345 - puede ser un buen método, puede ser malo, pero está distribuido (sin servidor), que es bonito.

Cuestiones relacionadas