Frage

Ich möchte eine einfache Synchronisationsfähigkeit in meine App schreiben, und eines der Bedenken, die aufgetaucht sind, ist die Synchronisation der Zeit zwischen zwei Remote -Computern, jeweils ihre eigene Uhr (insbesondere in Bezug auf die Änderungsdateien von Dateien/Objekten).

Ich bin mir sicher, dass zu diesem Thema viel Nachforschungen angestellt wurden und nicht zu theoretisch werden möchten, aber ich frage mich, ob es akzeptierte Best Practices gibt, um zeitliche Diskrepanzen zwischen entfernten Uhren zu minimieren.

Beispielsweise ist ein Start, immer universelle Zeit (UTC) zu verwenden, da dies Zeitzonprobleme vermeidet. Es gibt jedoch keine Garantie dafür, dass zwei Computer genau die gleiche Systemzeit haben. Zum Glück ist die Arbeit, die ich mache, nicht sehr feinkörnig, daher ist es keine schrecklich wichtige Sorge, aber ich bin trotzdem neugierig.

Eine Lösung wäre, immer die gleiche Uhr an beiden Enden zu verwenden, z. B. einen globalen Zeitserver und nicht an der lokalen Systemuhr. Vermutlich könnte dies (kombiniert mit gemeinsamen Ressourcensperrs) keine versehentliche Überschneidung der synchronisierten Zeit garantieren, aber es ist nicht sehr praktisch.

Man dachte, dass ich gerade in den Kopf aufgetaucht war, um jeden Knoten (jeden Client) mit einem Offset zu synchronisieren, das irgendwann zuvor berechnet wurde, möglicherweise durch Berechnung des Versatzes der Systemuhr mit einem globalen Zeitserver. Dies müsste nur gelegentlich erfolgen, da sich der Offset selbst wahrscheinlich über einen kurzen Zeitraum nicht wesentlich ändern würde.

Aktualisieren: Lassen Sie mich nur hinzufügen, dass ich nicht daran interessiert bin, die Systemuhren von zwei Computern tatsächlich zu synchronisieren-ich gehe davon aus, dass das Betriebssystem dies in den meisten Fällen behandelt. Dies ist nur die Frage, wie zwei Fälle einer Anwendung sichergestellt werden können, dass die synchronisierten Zeiten verwendet werden. In diesem Tag werden die Systemuhren heute in dieser Zeit sowieso fast sicherlich synchronisiert.

War es hilfreich?

Lösung

Wenn Sie sich auf NTP für Ihre Bewerbung verlassen, wie es andere empfohlen haben, ist der einfache Fudge. Der korrekte Ansatz ist die Verwendung von Lamports verteilter Takt -Synchronisationsalgorithmus. Es wird in seinem klassischen Papier von 1978 erklärt Zeit, Uhren und die Bestellung von Ereignissen in einem verteilten System.

Andere Tipps

Ansehen "Netzwerkzeitprotokoll"(NTP) Spezifikation.

Sie können PTP ausprobieren, das Präzisionszeitprotokoll (PTP) ist ein Protokoll, das zur Synchronisierung von Uhren in einem Computernetzwerk verwendet wird. In einem örtlichen Netzwerk erreicht es die Uhrgenauigkeit im Bereich Sub-Microsekunden, sodass es für Mess- und Steuerungssysteme geeignet ist.http://en.wikipedia.org/wiki/precision_time_protocol

Wäre es nicht möglich, einen NTP -Client auf beiden Maschinen auszuführen, anstatt Code zu schreiben, um die Uhren zu synchronisieren?

Wenn das oben genannte nicht möglich ist und Ihre App mit ausreichenden Berechtigungen ausgeführt wird, um die Zeit festzulegen, wäre ich versucht, einen minimalen NTP -Client -Recht in der Anwendung zu implementieren und mit einem öffentlichen Server zu synchronisieren. Hardcode jemandes privatem Server in ...

Synchronisieren Sie sie mit NTP Netzwerkzeitprotokoll.

Auf welcher Plattform bist du?

Mit NTP können Sie die Zeit Ihrer Computer mit Atomuhren synchronisieren und die offizielle Zeit der Welt nutzen.

Dies ist ein Problem, das ich derzeit in Bezug auf nicht anspruchsvolle Endbenutzer lösen muss, die viele Dinge tun können, um die vernünftigen Vorschläge der vorherigen Mitwirkenden zu stören. Ein nicht anspruchsvoller Endbenutzer kann zumindest diese Dinge und mehr tun:

1) verfügen nicht über genügend Computerwissen, um die NTP -Zeitsynchronisation einzurichten zu können

2) Setzen Sie ihre Computerzeituhr auf eine korrekte Hausuhr oder Handyuhr, die falsch ist

3) In Windows XP deaktivieren Sie die NTP -Zeit -Synchronisation versehentlich und wissen nicht, wie sie es erneut aktivieren oder das Computerdatum falsch festlegen lassen. In diesem Fall funktioniert Windows NTP nicht

4) Der Computer -BIOS -Akku ist flach geworden, so dass der PC immer 1970 beginnt!

5) Der Benutzer nimmt seinen Laptop ins Ausland und setzt die Laptop -Uhr vorübergehend auf die lokale Zeit, ändert jedoch nicht die Zeitzone. Daher wird der PC nun eine falsche UTC -Zeit zurückgeben !!!

Ihr Programm selbst muss also die Zeit verwalten, und natürlich möchten Sie dies mit minimalem Overhead tun.

Nehmen wir an, zwei Endbenutzer, die die Programme ausführen, benötigen die Programme, um in Zukunft etwas zu der gleichen absoluten Zeit zu tun.

Ich schlage dieses Schema vor, das einige Ideen aus der Art und Weise, wie Cron -Jobs arbeiten, glücklich sein würde, wenn jemand Verbesserungen der Idee vorschlagen kann.

1) Wenn Ihre Anwendung startet, synchronisiert sie seine eigene interne UTC -Zeit über einen SOAP -Anruf mit einem Seifenanruf an einen Drittanbieter -Server oder an Ihren eigenen Zeitserver (was Sie selbst mit NTP Zeit halten können).

2) Danach fügt es die verstrichene Zeit aus der Systemuhr hinzu, um die Zeit aufrechtzuerhalten. Wenn die Anforderungen streng sind, müssen Sie möglicherweise die NTP -Synchronisation in Intervallen wiederholen.

3) Die Anwendung befasst sich dann mit einer Liste zukünftiger Jobs, die sie pünktlich erledigen muss. Es muss den frühesten Job kennen.

4) Es schafft dann einen Faden, den es für die Zeit vor dem frühesten Job einnimmt, weniger einen Sicherheitsspielraum, der abhängig von Ihren Anforderungen 10 Minuten im Voraus, ein oder zwei Stunden im Voraus usw. sein kann.

5) Wenn der Thread aufwacht, lädt er die absolute Zeit mit einem weiteren Seifenanruf auf und stützt sich dann auf die Systemzeituhr, um die verstrichene Zeit hinzuzufügen, bis er die Zeit erreicht, in der der erste Job ausgeführt werden soll.

6) Sobald der Job ausgelöst wird (in einem anderen Thread ausführen), berechnet der Zeitüberwachungsthread die nächste Aufgabezeit und bringt sich für die Dauer wieder in den Schlaf.

Verbesserungen der Idee:

1) Ein Benutzer kann Ihre Anwendung vor dem ordnungsgemäßen Job schließen. Möglicherweise benötigen Sie möglicherweise einen Hintergrundprozess oder einen Dienst, der das gleiche Synchronisierungsschema oben verwendet, um Ihre Joblisten unabhängig zu überwachen, die in einer Datenbank oder Datei gespeichert sind, und die Start der Datei zu starten und die Anwendung in der Zeit. (In Windows laichen Sie den Anwendungsprozess an)

2) Ihre Bewerbung kann neuere, frühere Jobs im laufenden oder löschenden Jobs hinzufügen, sodass Ihr schlafender Thread wahrscheinlich für den neuen früheren Job oder für den Job nach dem gelöschten Job neu berechnet werden muss. In Win32 würden Sie dies durch Ihren Thread tun, der mit einer Auszeit auf ein Ereignis wartet, das Sie dazu zwingen, die Schlafzeit neu zu berechnen. In Linux gibt es zweifellos einen ähnlichen Mechanismus.

3) Damit der SOAP -Anruf die Zeit erhält, müssen Sie sich notieren, wenn die Seife gesendet wird und wann die Antwort empfangen wird. Wenn die Turnaround -Zeit zu lang ist, können Sie sich nicht auf die Zeit verlassen und müssen den Anruf möglicherweise wiederholen, oder Sie können Kompromisse eingehen. Wenn die Seife beispielsweise sagt, dass die Computeruhr 5 Minuten schnell ist, der Seifenanruf selbst eine Minute dauert, können Sie nur mit Sicherheit sagen, dass die Computeruhr mindestens 4 Minuten schnell ist.

Eine Sache, die wir tun, ist im Wesentlichen alle Timing -Vorgänge in den "Host" -Machcor zu laden. Wenn Sie beispielsweise 20 Server haben, die alle eine DB teilen, verwenden Sie die Zeit des DB. Wenn Sie einen zentralen Server und eine Million Client -Maschinen haben, sollten die Client -Maschinen nicht für das Timing von etwas verantwortlich sein. Führen Sie alle Ihre Synchronisierungs-Server-Seite durch. Verwenden Sie in einer wirklich "verteilten" Umgebung wie einem P2P -Netzwerk oder so den Maschine, das die betreffende Ressource am direkten besitzt (die tatsächliche PC, die Sie schreiben möchten), um den Zugriff auf die Datei zu synkronisieren/zu steuern.

Jeder vernetzte Computer sollte NTP verwenden. Alle modernen Systeme enthalten eine einfache Möglichkeit, dies einzurichten. Das einzige Problem sollte darin bestehen, einen bestimmten Server auszuwählen, wenn Sie etwas zusätzliche Präzision benötigen. Aber es ist schon im Millisekundenbereich, daher ist es mir egal und zeige normalerweise nur auf Pool.ntp.org

Don't use NTP. NTP is for getting date/time only.

It works to synchronize events between apps that don't communicate. An alarm app and your body, for instance.

For apps that have direct communication, sharing a resource, use lamport clocks or vector clocks as Diomidis said. Lamport clocks work great to achieve a partial order between events, Vector clocks are great when you need to identify concurrent events.

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