Pregunta

Necesito registrar eventos de manera independiente en diferentes computadoras y reconstruir en qué orden ocurrieron esos eventos uno con respecto al otro. La solución requiere que cada computadora sea relativamente independiente; no pueden hablar directamente entre ellos o con una sola fuente.

Mi solución inicial registró el tiempo en cada máquina, pero como los tiempos pueden ser diferentes en diferentes máquinas y pueden cambiar a lo largo del día, esto no resolvió por completo mi problema. Decidí compartir con todas las máquinas cada vez que una máquina (1) inicia el proceso o (2) tiene su cambio de reloj del sistema.

Entonces, de cada máquina obtengo un registro completo de estos

public class Activity {
    DateTime TimeOccurred { get; set; }
    string Description { get; set; }
}

Siempre que (1) o (2) suceden arriba, agrego una actividad al registro y la transmito a las otras máquinas, que agregan la misma actividad a su registro, siendo TranslatedTime su propio tiempo:

public class TimeSynchronization : Activity {
    string SourceMachine { get; set; }
    DateTime TranslatedTime { get; set; }
}

Entonces la máquina A tendría (en orden):

TimeSynchronization "started" at 3:00 am.
Activity "asked a question" at 3:05 am.
TimeSynchronization from machine B at 3:05 am.
TimeSynchronization "clock changed" at 3:03 am.
Activity "received an answer" at 3:04 am.

Y la máquina B tendría (en orden):

TimeSynchronization "started" at 3:05 am.
TimeSynchronization "clock changed" at 3:06

Entonces necesito reconstruir el mismo orden y tiempo de estos eventos anteriores, a algo como:

On machine A: TimeSynchronization "started" at 0:00
On machine A: Activity "asked a question" at 0:05
On machine B: TimeSynchronization "started" at 0:05
On machine A: TimeSychronization from machine B at 0:05
On machine A: TimeSynchronization "clock changed" at 0:06
On machine B: TimeSynchronization "clock changed" at 0:06
On machine A: Activity "received an answer" at 0:07

¿Cuál es la mejor manera de tomar un List<Activity> de cada máquina y combinarlo en una lista con los eventos en orden?

¿Fue útil?

Solución

Si las dos máquinas están conectadas a través de la red, su programa puede preguntarle a la otra máquina qué hora es. De esa forma, su programa en la máquina A podría pedir la hora en A y B y luego registrar ambas veces.

Usted menciona que la hora podría cambiar durante el día (presumiblemente, el usuario cambió la hora). Puede detectar esto utilizando el evento Win32.TimeChanged.

Otros consejos

Tiempo atómico, y un servicio web que te lo daría. Eso es lo que necesitas. ¿Realista? Ni idea. Pero al menos no debería preocuparse por las n computadoras que intentan sincronizar sus relojes.

Parece que quieren que intuyas hacia transacciones distribuidas

Además, consulte Protocolo de tiempo de red :

  

NTP es un protocolo diseñado para   sincronizar los relojes de las computadoras   a través de una red.

Creo que quieres grabar todo en UTC (hora universal). Esto permitirá que los tiempos se registren con sus tiempos relativos a un punto común en el tiempo y hace que la comparación de fechas / horas sea muy fácil. para mostrarlos en la hora local, simplemente identifica el desplazamiento y calcula la diferencia de la hora UTC a la local. p.ej. en la costa este es UTC -5, por lo que si la hora UTC es las 17:00, la hora local en Nueva York es las 12:00 y en Dallas su UTC-6, entonces son las 11:00 am.

así que si tiene un evento a las 11:10 am en Dallas, su hora UTC es las 17:10, y un evento en Nueva York a las 12:05 pm es las 17:05 UTC, sabrá que el evento de Nueva York ocurrió primero , pero si compara las veces que esto no parece ser así.

UTC también tiene la ventaja de que siempre representa las 24 horas del día, de modo que en el otoño, cuando se apaga el horario de verano, no obtiene 2 juegos de eventos de 2 a.m. a 3 a.m. y no pierde horas cuando llega la primavera adelante para pasar el tiempo de ahorro de luz del día.

Primero: si las operaciones en cada máquina son genuinamente paralelas, no puede garantizar que haya un único pedido serializado canónico. Si hay alguna coordinación en el proceso general, sería mejor utilizar algún tipo de secuencia en el protocolo, de modo que pueda ordenar por él.

Aparte de eso, debe calcular la inclinación del reloj entre máquinas para ajustar los tiempos. La forma de hacerlo es razonablemente simple: pregunte a la otra máquina su hora actual y mida el tiempo de ida y vuelta para esa solicitud. Suponga que el tiempo informado por la máquina remota era verdadero a la mitad del tiempo de ida y vuelta (esto supone una demora simétrica en promedio, no siempre es cierto, pero realmente no puede hacerlo mejor sin profundizar en el diseño de la red), y reste desde el tiempo actual de la máquina. Ese es tu reloj sesgado. Es posible que desee medir la inclinación varias veces y tomar un promedio, para igualar el retraso intermitente en la conexión.

Si necesita una sincronización de reloj muy precisa entre computadoras, use el GPS.

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