8

Wir haben ein großes Hochleistungs-Software-System, das aus mehreren interagierenden Java-Prozessen (nicht EJBs) besteht. Jeder Prozess kann sich auf derselben Maschine oder auf einer anderen Maschine befinden.Gibt es eine Uhrzeitsynchronisierungslösung für Java?

Bestimmte Ereignisse werden in einem Prozess generiert und dann auf andere Weise an andere Prozesse zur weiteren Verarbeitung weitergegeben.

Für Benchmarking-Zwecke müssen wir ein Protokoll erstellen, wann jedes Ereignis einen "Checkpoint" durchlaufen hat, schließlich diese Protokolle kombinieren, um einen Zeitplan zu erhalten, wie sich jedes Ereignis im System ausbreitet und mit welcher Latenz (natürlich, Prozess Switching und IPC fügt Latenz hinzu, was in Ordnung ist).

Das Problem ist natürlich Uhrzeitsynchronisation. Also hier sind meine Fragen:

1) Wenn alle Prozesse auf der gleichen Maschine sind, ist es garantiert, dass currentTimeMilis zum Zeitpunkt des Anrufs genau wäre? Sind die Fehler von ITP in Grenzen?

2) Wenn sich einige Prozesse auf verschiedenen Maschinen befinden, gibt es eine Standardlösung (die auch frei oder Open-Source ist) für die Uhrzeitsynchronisation? Ich suche vorzugsweise nach einer Lösung, die das Betriebssystem (Windows oder Linux) umgehen und direkt von Java aus arbeiten kann. Ich suche auch ideal nach etwas, das mit Mikrosekunden genau arbeiten kann. Ich habe über NTP nachgedacht, aber ich bin mir nicht sicher, ob es über Java und nicht über das Betriebssystem verfügbar ist, und ich bin mir nicht sicher, wie komplex es ist.

3) Gibt es eine Möglichkeit, die Fehlerquote bei der Verwendung von NTP in einer bestimmten Konfiguration (oder einer beliebigen Lösung, die ich verwende) zu bestimmen, damit ich eine Fehlermarge bei der Berechnung der Latenz angeben kann?

Danke!

Antwort

4

Bei verteilter Programmierung reicht die Uhrzeitsynchronisation oft nicht aus. Vielleicht möchten Sie einen logischen Zeitrahmen erstellen (wie die Lamport- oder Vektoruhren oder Singhal-Kshemkalyani-Methoden ... und es gibt noch viel mehr, um die Kausalität auf allen Maschinen synchron zu halten). Welche Sie wählen, hängt oft von der Anwendung und der erforderlichen Kausalität zwischen den Ereignissen ab.

Die Uhren werden synchronisiert, um sicherzustellen, dass die gleichzeitigen Ereignisse in der richtigen Reihenfolge gehalten werden. Es gibt andere Möglichkeiten, dies zu tun, als die Systemuhr synchronisiert zu halten ... die, außer wenn sie eine gemeinsame physikalische Uhr teilen ... ziemlich kompliziert ist.

In Bezug auf die NTP-Fehlermarge gibt es Lösungen:

meine Empfehlung:

lesen: Distributed Computing: Grundsätze, Algorithmen und Systeme

Vor allem: Kapitel 3, logische Zeit

Bearbeiten

Zusätzlich zu Cheeso der Post fand ich

http://www.uniforum.org/publications/ufm/apr96/opengroup.html

http://sourceforge.net/projects/freedce

Es gibt vielleicht DCE Java-Bindungen gibt.

+0

Ich erinnere mich an das Buch vom College. Unser Projekt sucht momentan nach etwas schnellem und einigermaßen genauem, wir können nicht die ersten Leute sein, die so etwas brauchen. Ich habe mich gefragt, ob es eine Implementierung von der Stange gibt. – Uri

+0

Nicht, dass ich weiß, aber mit JVM wird es viele Latenzen geben. Die Programmumgebung ist nicht stark gekoppelt und kann stehen bleiben (auf GC usw.). Ich bin jedoch kein Java-Experte. –

0

Die alte DCE ("Distributed Computing Environment") verwendet, um eine verteilte Zeitsynchronisierungslösung mit all diesen Fähigkeiten zu haben. Es hieß DTS. Der Administrator könnte die zu synchronisierenden Geräte konfigurieren und die Latenz oder Unsicherheit wurde berechnet und ist verfügbar. Wenn irgendeine Maschine nicht mehr synchron war, wurde die Uhr langsam eingestellt, bis sie wieder synchron war. Es gab eine Garantie, dass die Zeit auf irgendeiner Maschine niemals rückwärts eingestellt würde (unter Verletzung der grundlegenden Physik). Das Netzwerk benötigte mindestens einen NTP-Eingang, um mit der "echten Welt" synchronisiert zu bleiben.

Ich weiß nicht, was mit dem Zeitsynchronisations-Zeug oder dem DCE-Code im Allgemeinen passiert ist.

Scheint mir, Sie brauchen keine Lösung "in Java". Sie müssen die Uhren eines Satzes verteilter Maschinen synchronisieren. Die Java App ist genau das, was auf den Maschinen läuft.

+0

Mein Verständnis war, dass die meisten Betriebssysteme eine Synchronisationsmethode mit einer hohen Fehlermarge verwenden (ca. 10-100ms), was für die meisten Praktiken akzeptabel ist. Ich habe über Java nachgedacht, da ich möglicherweise einen Dienst mit höherer Genauigkeit verwenden kann. – Uri

+0

@Cheeso - DCE war seiner Zeit voraus :) –

+0

@Uri - ja ich sehe, Sie wollen eine höhere Genauigkeit Lösung. Ich möchte nur sagen, dass es möglich ist, unabhängig von jedem Java-Code zu synchronisieren. Es kann möglich sein, den Zeitsynchronisationsteil vollständig aus der Java-Anwendung herauszufiltern, so dass eine Entwurfsannahme in der Java-App "Zeit ist synchronisiert" ist. Aber diese Designwahl liegt bei Ihnen! b – Cheeso

2

Ich würde wirklich nur NTP verwenden. Es ist sogar über das Internet ziemlich genau, und in einem LAN sollte es noch besser sein. Laut Wikipedia [1],

NTPv4 kann normalerweise Zeit bis zu 10 Millisekunden (1/100 s) über das öffentliche Internet einhalten und kann in lokalen Netzwerken Genauigkeiten von 200 Mikrosekunden (1/5000 s) oder besser erreichen unter idealen Bedingungen.

so kann es gut genug für Ihre Bedürfnisse sein, wenn Ihre Bedingungen "ideal" genug sind. NTP gibt es schon lange genug, dass so ziemlich alles damit funktioniert. Ich sehe keinen Grund, dies über Java und nicht über das Betriebssystem zu tun. Wenn das Betriebssystem synchronisiert wird, wird es auch Java sein.

[1] Wikipedia: Network Time Protocol