Gibt es eine Standard-Synchronisierungslösung für Java?

8

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!

    
Uri 02.06.2009, 13:42
quelle

4 Antworten

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). 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.

    
Aiden Bell 02.06.2009, 13:48
quelle
2

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.

[1] Wikipedia: Network Time Protocol

    
Adam Jaskiewicz 02.06.2009 14:53
quelle
1

Ich bin diesem Thread begegnet, nachdem ich etwas selbst versucht habe (sollte vorher gesucht haben!) Ссылка - mag eine gute Methode sein, mag schlecht sein, aber es ist verteilt (serverlos), was nett ist.

    
Benjamin 14.05.2010 21:25
quelle
0

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.

    
Cheeso 02.06.2009 13:48
quelle