Pregunta

Estoy buscando escribir una capacidad de sincronización simple en mi aplicación y una de las preocupaciones que ha surgido es la sincronización del tiempo entre dos computadoras remotas, cada una con su propio reloj (en particular con respecto a las fechas de modificación de archivos/objetos).

Estoy seguro de que se han realizado mucha investigación sobre este tema y no quiere ser demasiado teórico, pero me pregunto si hay alguna práctica aceptada para minimizar las discrepancias temporales entre los relojes remotos.

Por ejemplo, un comienzo es usar siempre el tiempo universal (UTC), ya que eso evita los problemas de la zona horaria, pero no hay garantía de que dos computadoras tengan exactamente el mismo tiempo del sistema. Afortunadamente, el trabajo que estoy haciendo no es muy fino, por lo que no es una preocupación terriblemente importante, pero todavía tengo curiosidad.

Una solución sería usar siempre el mismo reloj en ambos extremos, como un servidor de tiempo global, en lugar del reloj del sistema local. Presumiblemente, esto (combinado con bloqueos de recursos compartidos) podría garantizar que no hay una superposición accidental de tiempo sincronizado, pero no es muy práctico.

Un pensamiento que simplemente apareció en mi cabeza sería sincronizar cada nodo (cada cliente) con un desplazamiento calculado en algún momento anterior, tal vez calculando la compensación del reloj del sistema con un servidor de tiempo global. Esto solo tendría que hacerse ocasionalmente, ya que la compensación en sí no cambiaría mucho en un corto período de tiempo.

Actualizar: Permítanme agregar que no estoy interesado en sincronizar los relojes del sistema de dos computadoras; supongo que el sistema operativo manejará esto en la mayoría de los casos. Esta es solo una cuestión de cómo garantizar que dos instancias de una aplicación estén utilizando tiempos sincronizados, aunque en la actualidad, supongo que los relojes del sistema casi seguramente se sincronizarán dentro de un delta muy pequeño de todos modos.

¿Fue útil?

Solución

Confiar en NTP para su aplicación, como otros han recomendado, es el fácil azúcar. El enfoque correcto es utilizar el algoritmo de sincronización de reloj distribuido de Lamport. Se explica en su clásico artículo de 1978 Tiempo, relojes y el pedido de eventos en un sistema distribuido.

Otros consejos

Mirar "Protocolo de tiempo de red"(NTP) especificación.

Puede probar PTP, el protocolo de tiempo de precisión (PTP) es un protocolo utilizado para sincronizar los relojes en toda la red de computadoras. En una red de área local, logra la precisión del reloj en el rango de submicrosegundos, por lo que es adecuada para los sistemas de medición y control.http://en.wikipedia.org/wiki/precision_time_protocol

En lugar de escribir código para sincronizar los relojes, ¿no sería posible ejecutar un cliente NTP en ambas máquinas?

Alternativamente, si lo anterior no es posible y su aplicación se ejecuta con privilegios suficientes para establecer el tiempo, me tentaría implementar un cliente NTP mínimo en la aplicación e intentar sincronizarlo con un servidor público. Simplemente no codifique el servidor privado de alguien en ...

Sincronizarlos con NTP Protocolo de tiempo de red.

¿En qué plataforma estás?

Con NTP puede sincronizar el tiempo de sus computadoras con relojes atómicos y usar el tiempo oficial del mundo.

Este es un problema que actualmente tengo que resolver con respecto a los usuarios finales poco sofisticados que pueden hacer muchas cosas para alterar las sugerencias sensatas hechas por los contribuyentes anteriores. Un usuario final poco sofisticado puede hacer al menos estas cosas y más:

1) No tener suficiente conocimiento informático para poder configurar la sincronización de tiempo NTP

2) Establezca el reloj de tiempo de su computadora en un reloj de casa o un reloj de teléfono móvil que sea incorrecto

3) En Windows XP, desactive accidentalmente la sincronización de tiempo NTP y no sepa cómo habilitarlo nuevamente, o que la fecha de su computadora se establezca incorrectamente, en cuyo caso Windows NTP no funciona

4) ¡La batería de la BIOS de la computadora se ha ido de plana, por lo que la PC siempre se inicia en 1970!

5) El usuario lleva su computadora portátil al extranjero y establece temporalmente el reloj de la computadora portátil a la hora local pero no cambia la zona horaria, por lo que ahora la PC devolverá la hora de UTC incorrecta.

Por lo tanto, su programa en sí tendrá que administrar el tiempo y, por supuesto, desea hacerlo con una sobrecarga mínima.

Supongamos que dos usuarios finales que ejecutan sus programas necesitan los programas para hacer algo al mismo tiempo absoluto en el futuro.

Propongo este esquema, que toma algunas ideas de la forma en que funcionan los trabajos de Cron, estaría feliz si alguien puede sugerir mejoras en la idea.

1) Cuando se inicia su aplicación, sincroniza su propio tiempo interno de UTC a NTP a través de una llamada SOAP a un servidor de terceros o a su propio servidor de tiempo (que puede mantener a tiempo con NTP).

2) Después de eso se suma el tiempo transcurrido desde el reloj del sistema para mantener el tiempo. Si los requisitos son estrictos, es posible que deba repetir la sincronización NTP a intervalos.

3) La aplicación luego analiza una lista de trabajos futuros que debe hacer a tiempo. Necesita saber el primer trabajo.

4) Luego crea un hilo que duerme durante el tiempo antes del trabajo más temprano, menos un margen de seguridad, que dependiendo de sus requisitos podría tener 10 minutos de anticipación, una o dos horas de anticipación, etc.

5) Cuando el hilo se despierta, vuelve a verificar el tiempo absoluto con una llamada de jabón adicional, y luego depende del reloj de tiempo del sistema para agregar el tiempo transcurrido hasta que llega al momento en que se debe llevar a cabo el primer trabajo.

6) Tan pronto como se activa el trabajo (ejecutarlo en otro hilo), el hilo de monitoreo de tiempo calcula la siguiente tarea que se avecina y se pone a dormir nuevamente durante la duración.

Mejoras a la idea:

1) Un usuario puede cerrar su aplicación antes del trabajo de vencimiento, por lo que es posible que necesite un proceso o servicio de fondo, que utiliza el mismo esquema de sincronización anterior, para monitorear de forma independiente sus listas de trabajo, almacenarse en una base de datos o archivo, e iniciar el Aplicación en el tiempo. (En Windows, genere el proceso de aplicación)

2) Su aplicación puede estar agregando trabajos más nuevos y anteriores sobre la marcha, o eliminar trabajos, por lo que su hilo para dormir probablemente deberá ser desagradable para recalcular el nuevo trabajo anterior, o para el trabajo después del trabajo eliminado. En Win32 lo haría con su hilo esperando con tiempo de espera en un evento, que establece para obligarlo a recalcular el tiempo de sueño. En Linux, sin duda, hay un mecanismo similar.

3) Para la llamada de jabón para obtener el tiempo, mantenga una nota de cuándo se envía el jabón y cuándo se recibe la respuesta. Si el tiempo de respuesta es demasiado largo, no puede confiar en el tiempo y puede necesitar repetir la llamada, o puede comprometerse. Por ejemplo, si el SOAP dice que el reloj de la computadora mide 5 minutos de rápido, pero la llamada de jabón en sí misma tomó un minuto para responder, solo puede decir con certeza que el reloj de la computadora está al menos 4 minutos de rápido.

Una cosa que hacemos es esencialmente descargar todas las operaciones de tiempo en la máquina 'host'. Por ejemplo, si tiene 20 servidores que comparten un DB, use el tiempo de DB. Si tiene un servidor central y un millón de máquinas cliente, entonces las máquinas cliente no deberían ser responsables de cronometrar nada; Haga todo su lado del servidor de sincronización. En un entorno verdaderamente 'distribuido', como una red P2P o algo así, use la máquina que 'posee' más directamente el recurso en cuestión (la PC real en el archivo que desea escribir) para sincronizar/controlar el acceso al archivo.

Cualquier máquina en red debe usar NTP. Todos los sistemas modernos incluyen una manera fácil de configurar esto. El único problema debe ser elegir un servidor específico, si necesita un poco de precisión adicional; Pero ya está en el rango de milisegundos, por lo que no me importa y, por lo general, apunto a piscina.ntp.org

No use NTP. NTP es solo para obtener fecha/hora.

Funciona para sincronizar eventos entre aplicaciones que no se comunican. Una aplicación de alarma y su cuerpo, por ejemplo.

Para las aplicaciones que tienen comunicación directa, compartiendo un recurso, use relojes Lamport o relojes vectoriales como dijo Diomidis. Los relojes de Lamport funcionan muy bien para lograr un orden parcial entre los eventos, los relojes vectoriales son excelentes cuando necesita identificar eventos concurrentes.

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