2008-12-23 15 views
13

Estoy buscando escribir una sencilla capacidad de sincronización en mi aplicación y una de las preocupaciones que surgió 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).Sincronización (de relojes) entre dos computadoras remotas

Estoy seguro de que se han realizado muchas investigaciones sobre este tema y no quiero ser demasiado teórico, pero me pregunto si hay algunas mejores prácticas aceptadas para minimizar las discrepancias temporales entre los relojes remotos.

Por ejemplo, un comienzo es usar siempre la hora universal (UTC) ya que evita los problemas de la zona horaria, pero no hay garantía de que dos computadoras tengan exactamente la misma hora 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 utilizar siempre el mismo reloj en ambos extremos, como un servidor de tiempo global, en lugar del reloj del sistema local. Es de suponer que esto (combinado con bloqueos de recursos compartidos) podría garantizar una superposición accidental del tiempo sincronizado, pero no es muy práctico.

Un pensamiento que me vino a la cabeza sería sincronizar cada nodo (cada cliente) con un desplazamiento calculado en algún punto anterior, quizás calculando el desplazamiento del reloj del sistema con un servidor horario global. Esto solo tendría que hacerse ocasionalmente ya que la compensación en sí misma probablemente no cambiaría demasiado en un corto período de tiempo.

Actualización: Permítanme agregar que no estoy interesado en realmente 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 asegurar que dos instancias de una aplicación utilicen tiempos sincronizados, aunque en este día y época supongo que los relojes del sistema casi con seguridad se sincronizarían dentro de algún delta muy pequeño de todos modos.

Respuesta

18

Confiar en NTP para su aplicación como otros lo han recomendado es fácil. El enfoque correcto es utilizar el algoritmo de sincronización de reloj distribuido de Lamport. Se explica en su clásico documento de 1978 Time, clocks, and the ordering of events in a distributed system.

+1

Busqué el artículo de Lamport, y parece ser ampliamente citado en la discusión de la sincronización del reloj. Desafortunadamente, [parece] (http://www.amazon.com/Distributed-Systems-Principles-Paradigms-2nd/dp/0132392275) que este algoritmo no es adecuado para aplicaciones en tiempo real (como el discutido [aquí] (http://stackoverflow.com/questions/12760388/how-to-set-a-variable-that-represents-a- time-in-the-future-in-absolute-terms-obj)) .. ¿Algún consejo sobre algoritmos de sincronización de reloj en tiempo real que no depende de NTP? – abbood

3

Sincronícelos con NTP Network Time Protocol.

¿En qué plataforma estás?

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

+0

.NET, pero es más una cuestión de teoría que nada. – devios1

3

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

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

+0

No estoy muy interesado en cambiar el reloj del sistema del usuario. – devios1

0

cualquier máquina en red debe usar NTP. todos los sistemas modernos incluyen una manera fácil de configurar esto. el único problema debería ser elegir un servidor específico, si necesita un poco de precisión adicional; pero ya está en el rango de milisegundos, así que no me importa y generalmente solo apunto a pool.ntp.org

2

Una cosa que hacemos es esencialmente descargar todas las operaciones de sincronización a la máquina 'host'. Por ejemplo, si tiene 20 servidores que comparten una base de datos, use la hora de la base de datos. 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; hacer toda la sincronización del lado del servidor.En un entorno verdaderamente 'distribuido', como una red P2P o algo así, utilice la máquina que 'posee' más directamente el recurso en cuestión (la PC real, el archivo que desea escribir) para sincronizar/controlar el acceso al archivo.

+0

Estas son buenas sugerencias y más el tipo de respuesta que estaba buscando. Sin embargo, supongamos que ninguna computadora posee el recurso y que realmente se comparte. Además, ninguna computadora tiene acceso directo a la otra computadora y, por lo tanto, no puede usar su reloj. – devios1

3

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 colaboradores anteriores. Un usuario final poco sofisticado puede hacer por lo menos estas cosas, y más:

1) no tiene suficientes conocimientos informáticos para poder configurar NTP tiempo de sincronización

2) puesto su reloj de tiempo de computadora a un reloj de casa o un reloj teléfono móvil que es incorrecta

3) en Windows XP accidentalmente inhabilitar la sincronización de hora NTP y no saber cómo habilitarlo de nuevo, o tienen su fecha de equipo configurado erróneamente, en cuyo caso NTP de Windows no funciona

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

5) El usuario toma su computadora portátil en el extranjero y temporalmente establece el reloj de la computadora portátil a la hora local, pero no cambia la zona horaria, por lo que ahora la PC devolverá un horario incorrecto.

Por lo tanto, su programa 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 que los programas hagan algo en el mismo momento absoluto en el futuro.

Propongo este esquema, que toma algunas ideas de la forma en que funcionan los trabajos cron. Me alegra que cualquiera pueda sugerir mejoras a la idea.

1) Cuando se inicia la aplicación, sincroniza su propio tiempo interno utt a ntp a través de una llamada a un servidor externo o a su propio servidor horario (que puede mantener a tiempo con ntp).

2) Después de eso, agrega 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 mira una lista de trabajos futuros que necesita hacer a tiempo. Necesita saber el primer trabajo.

4) Luego crea un hilo que se pone a dormir durante el tiempo anterior al primer trabajo, menos un margen de seguridad, que dependiendo de sus requisitos podría ser de 10 minutos de antelación, una o dos horas de antelación etc.

5) Cuando el hilo se despierta, vuelve a comprobar el tiempo absoluto con una nueva llamada y confía en el reloj del sistema para agregar el tiempo transcurrido hasta que llega el momento del primer trabajo. fuera.

6) Tan pronto como se desencadena el trabajo (ejecutarlo en otro hilo), el hilo de control de tiempo calcula el próximo tiempo de tarea adelante y se pone a dormir de nuevo durante el tiempo.

Mejoras en la idea:

1) Un usuario puede cerrar la aplicación antes de la debida trabajo, lo que puede tener un proceso de fondo o servicio, que utiliza el mismo esquema de sincronización anterior, para controlar de forma independiente su trabajo listas, almacenadas en una base de datos o archivo, y poner en marcha la aplicación a tiempo. (En Windows, genere el proceso de solicitud)

2) Su aplicación puede estar agregando trabajos más nuevos, anteriores sobre la marcha o eliminando trabajos, por lo que su hilo de dormir probablemente deba ser reactivable para volver a calcular para el nuevo trabajo anterior, o para el trabajo que sigue al trabajo eliminado. En Win32, haría esto mediante el hilo que espera con tiempo de espera en un evento, que configurará para obligarlo a volver a calcular el tiempo de reposo. En Linux, sin duda, hay un mecanismo similar.

3) Para que la llamada de Soap consiga 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 jabón dice que el reloj de la computadora tarda 5 minutos, pero la llamada de Soap tardó un minuto en responder, entonces solo puedes decir con certeza que el reloj de la computadora está al menos 4 minutos rápido.

0

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

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

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

5

Puede probar PTP, el Precision Time Protocol (PTP) es un protocolo utilizado para sincronizar relojes en una red informática. En una red de área local, logra precisión de reloj en el rango de sub-microsegundos, por lo que es adecuado para sistemas de medición y control. http://en.wikipedia.org/wiki/Precision_Time_Protocol

Cuestiones relacionadas