Frage

Ich muss unabhängig voneinander Ereignisse auf verschiedenen Computern aufzeichnen und rekonstruieren, welche Ordnung diese Ereignisse im Verhältnis zueinander ereignen. Die Lösung fordert, dass jeder Computer relativ unabhängig ist. Sie können nicht direkt miteinander oder einer einzigen Quelle sprechen.

Meine anfängliche Lösung hat die Zeit auf jeder Maschine aufgezeichnet, aber da die Zeiten auf verschiedenen Maschinen unterschiedlich sein können und sich den ganzen Tag ändern können, hat dies mein Problem nicht vollständig gelöst. Ich habe mich entschlossen, mit allen Maschinen zu teilen, wenn eine Maschine (1) den Prozess startet, oder (2) hat seine Systemaktualisierung.

Von jeder Maschine bekomme ich ein Protokoll voller diesen

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

Wann immer (1) oder (2) oben auftritt, füge ich dem Protokoll eine Aktivität hinzu und sende es den anderen Maschinen, die der gleichen Aktivität zu ihrem Protokoll hinzufügen, wobei die Übersetzungszeit ihre eigene Zeit ist:

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

Also hätte Maschine A (in Ordnung):

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.

Und Maschine B hätte (in Ordnung):

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

Daher muss ich die gleiche Reihenfolge und das gleiche Timing dieser obigen Ereignisse rekonstruieren, zu etwas wie:

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

Was ist der beste Weg, um eine zu nehmen List<Activity> von jeder Maschine und fusionieren Sie sie mit den Ereignissen in eine Liste in der Reihenfolge?

War es hilfreich?

Lösung

Wenn die beiden Maschinen über das Netzwerk verbunden sind, kann Ihr Programm die andere Maschine fragen, wie spät es ist. Auf diese Weise könnte Ihr Programm auf Maschine A um die Zeit auf A und B fragen und dann beide Male protokollieren.

Sie erwähnen, dass sich die Zeit tagsüber ändern könnte (vermutlich hat der Benutzer die Zeit geändert). Sie können dies mit der Win32.Timeched -Veranstaltung erkennen.

Andere Tipps

Atomische Zeit und ein Webservice, der es Ihnen geben würde. Das brauchst du. Realistisch? Keine Ahnung. Aber zumindest müssten Sie sich keine Sorgen um die N -Computer machen, die versuchen, ihre Uhren zu synchronisieren.

Sieht so aus, als ob sie wollen, dass Sie intuitiv sind verteilte Transaktionen

Schauen Sie sich auch an Netzwerkzeitprotokoll:

NTP ist ein Protokoll, das zur Synchronisierung der Computeruhren über ein Netzwerk entwickelt wurde.

Ich denke, Sie möchten alles in UTC (Universal Time) aufnehmen. Dies ermöglicht es, dass Zeiten mit ihrer Zeit im Verhältnis zu einem gemeinsamen Zeitpunkt aufgezeichnet werden und den Vergleich von Daten/Zeiten sehr einfach machen. Um sie in lokaler Zeit anzuzeigen, identifizieren Sie einfach den Offset und berechnen den Unterschied von der UTC -Zeit bis zu lokal. zB an der Ostküste sein UTC -5.

Wenn Sie also eine Veranstaltung um 11:10 Uhr in Dallas haben, beträgt die UTC -Zeit 17:10 und eine Veranstaltung in New York um 12:05 Uhr 17:05 UTC, wissen Sie, dass das New Yorker Event zuerst stattgefunden hat, aber wenn Sie roh verglichen die Zeiten, die dies nicht zu sein scheint.

UTC hat auch den Vorteil, dass es am Tag immer alle 24 Stunden darstellt, so dass Sie im Herbst, wenn Sie die Tageseinsparung Zeit haben Auf Dalylight Spardauer.

Zuerst: Wenn die Operationen in jeder Maschine wirklich parallel sind, können Sie nicht garantieren, dass es eine einzelne kanonische serialisierte Bestellung gibt. Wenn der Gesamtprozess eine gewisse Koordination vorliegt, sollten Sie im Protokoll eine Art Sequenzierung besser verwenden, damit Sie einfach sortieren können.

Abgesehen davon müssen Sie die Zeit zwischen Maschinen berechnen, um die Zeiten anzupassen. Die Art und Weise, wie Sie dies tun, ist einigermaßen einfach: Fragen Sie die andere Maschine nach der aktuellen Zeit und messen Sie die Hin- und Rückfahrt für diese Anfrage. Angenommen, die Zeit, die die Remote -Maschine gemeldet hat Es aus der Zeit der aktuellen Maschine. Das ist deine Uhr verzerrt. Möglicherweise möchten Sie den Schräber mehrmals messen und einen Durchschnitt nehmen, um die intermittierende Verzögerung an der Verbindung auszugleichen.

Wenn Sie zwischen Computern eine sehr genaue Uhr -Synchronisation benötigen, verwenden Sie GPS.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top