Wir haben ein großes Hochleistungs-Softwaresystem, das aus mehreren interagierenden Java-Prozessen (nicht EJBs) besteht. Jeder Prozess kann sich auf demselben Computer oder auf einem anderen Computer befinden.
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 darüber erstellen, wann jedes Ereignis einen "Checkpoint" durchlaufen hat. Schließlich können diese Protokolle kombiniert werden, um eine Zeitachse zu erhalten, wie sich jedes Ereignis im System ausbreitet und mit welcher Latenzzeit (Prozessumschaltung) und IPC fügt Latenz hinzu, was in Ordnung ist).
Das Problem ist natürlich die Uhrzeitsynchronisation. Also hier sind meine Fragen:
1) Wenn alle Prozesse auf derselben Maschine ausgeführt werden, ist sichergestellt, dass currentTimeMilis zum Zeitpunkt des Aufrufs genau ist? Sind die Fehler von ITP etwas begrenzt?
2) Wenn sich einige Prozesse auf verschiedenen Rechnern 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 bei der Berechnung der Latenz einen Fehler geben kann? p>
Danke!
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). Was 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 schwierig ist.
Hinsichtlich der NTP-Fehlermarge gibt es Lösungen:
meine Empfehlung:
Lesen: Verteiltes Rechnen: Prinzipien, Algorithmen und Systeme
Vor allem: Kapitel 3, logische Zeit
Bearbeiten
Neben Cheesos Post fand ich
Da gibt es vielleicht DCE Java Bindings.
Ich würde wirklich nur NTP benutzen. Es ist sogar über das Internet ziemlich genau, und in einem LAN sollte es noch besser sein. Laut Wikipedia [ 1 ],
NTPv4 kann in der Regel innerhalb von 10 Millisekunden (1/100 s) Zeit über das öffentliche Internet halten und kann in lokalen Netzwerken unter idealen Bedingungen Genauigkeiten von 200 Mikrosekunden (1/5000 s) oder besser erreichen.
Es kann also 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.
Die alte DCE ("Distributed Computing Environment") hatte früher eine verteilte Zeitsynchronisierungslösung mit all diesen Fähigkeiten . 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 diesen Zeitsynchronisations-Sachen oder dem DCE-Code im Allgemeinen passiert ist.
Mir scheint, 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.
Tags und Links java distributed real-time clock-synchronization vector-clock