Domanda

Devo registrare in modo indipendente eventi su computer diversi e ricostruire l'ordine in cui tali eventi si sono verificati l'uno rispetto all'altro. La soluzione richiede che ciascun computer sia relativamente indipendente; non possono parlare direttamente tra loro o con un'unica fonte.

La mia soluzione iniziale ha registrato l'ora su ogni macchina, ma poiché i tempi possono essere diversi su macchine diverse e possono cambiare nel corso della giornata, questo non ha risolto completamente il mio problema. Ho deciso di condividere con tutte le macchine ogni volta che una macchina (1) avvia il processo o (2) ha il cambio dell'orologio di sistema.

Quindi da ogni macchina ottengo un registro pieno di questi

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

Ogni volta che (1) o (2) si verifica sopra, aggiungo un'attività al registro e la trasmetto alle altre macchine, che aggiungono la stessa attività al loro registro, con TranslatedTime che è il loro tempo:

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

Quindi la macchina A avrebbe (in ordine):

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.

E la macchina B avrebbe (in ordine):

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

Quindi ho bisogno di ricostruire lo stesso ordine e tempismo di questi eventi sopra, a qualcosa del tipo:

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

Qual è il modo migliore per prendere un List<Activity> da ogni macchina e unirlo in un elenco con gli eventi in ordine?

È stato utile?

Soluzione

Se le due macchine sono collegate tramite la rete, il programma può chiedere all'altra macchina che ore sono. In questo modo il programma sulla macchina A potrebbe richiedere l'ora sia su A che su B e quindi registrare entrambe le volte.

Lei dice che l'ora potrebbe cambiare durante il giorno (presumibilmente l'utente ha cambiato l'ora). È possibile rilevare ciò utilizzando l'evento Win32.TimeChanged.

Altri suggerimenti

Tempo atomico e un servizio web che te lo darebbe. Questo è quello che ti serve. Realistico? Nessuna idea. Ma almeno non dovresti preoccuparti che n computer provino a sincronizzare i loro orologi.

Sembra che vogliano intuire verso transazioni distribuite

Inoltre, controlla Network Time Protocol :

  

NTP è un protocollo progettato per   sincronizzare gli orologi dei computer   su una rete.

Penso che tu voglia registrare tutto in UTC (tempo universale). Ciò consentirà di registrare i tempi con i relativi tempi rispetto a un punto temporale comune e semplificare il confronto di date / orari. per visualizzarli nell'ora locale è sufficiente identificare l'offset e calcolare la differenza dall'ora UTC al locale. per esempio. sulla costa orientale il suo UTC -5, quindi se l'ora UTC è alle 17:00, l'ora locale a New York è alle 12:00 e a Dallas il suo UTC-6, quindi le 11:00.

quindi se hai un evento alle 11:10 a Dallas, l'ora UTC è alle 17:10, e un evento a New York alle 12:05 pm è alle 17:05 UTC, sai che l'evento di New York si è verificato per primo , ma se crudi rispetto ai tempi questo non sembrerebbe essere così.

UTC ha anche il vantaggio di rappresentare sempre tutte le 24 ore del giorno, in modo che in autunno quando si spegne il tempo di risparmio di luce del giorno, non si ottengono 2 serie di eventi dalle 2 alle 3 del mattino e non si perdono ore in primavera avanti per andare sul risparmio di tempo dalylight.

Primo piano: se le operazioni su ciascuna macchina sono realmente parallele, non è possibile garantire l'esistenza di un singolo ordinamento canonico serializzato. Se c'è un po 'di coordinamento nel processo generale, sarebbe meglio usare un qualche tipo di sequenziamento nel protocollo, in modo da poterlo semplicemente ordinare.

A parte questo, è necessario calcolare l'inclinazione dell'orologio tra le macchine per regolare i tempi. Il modo in cui lo fai è ragionevolmente semplice: chiedi all'altra macchina l'ora corrente e misura il tempo di andata e ritorno per quella richiesta. Supponiamo che il tempo riportato dalla macchina remota fosse vero a metà del tempo di andata e ritorno fa (ciò presuppone in media ritardi simmetrici - non sempre vero, ma non puoi davvero fare di meglio senza scavare in profondità nel layout di rete) e sottrarre dal tempo della macchina corrente. Questo è il tuo orologio inclinato. Potresti voler misurare l'inclinazione più volte e prendere una media, per uniformare il ritardo intermittente sulla connessione.

Se hai bisogno di una sincronizzazione dell'orologio molto accurata tra computer, usa il GPS.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top