8

Mamy duży, wysoce wydajny system oprogramowania, który składa się z wielu interaktywnych procesów Java (nie EJB). Każdy proces może znajdować się na tej samej maszynie lub na innej maszynie.Czy istnieje gotowe do synchronizacji rozwiązanie synchronizacji zegarów dla Javy?

Niektóre zdarzenia są generowane w jednym procesie, a następnie są propagowane na różne sposoby do innych procesów w celu dalszego przetwarzania i tak dalej.

Dla celów analizy porównawczej, musimy utworzyć dziennik, w którym każde zdarzenie przechodzi przez "punkt kontrolny", ewentualnie połączyć te dzienniki, aby uzyskać oś czasu, w którym każde zdarzenie jest propagowane przez system i jakie opóźnienie (oczywiście proces przełączanie i IPC dodaje opóźnienie, co jest ok).

Problemem jest oczywiście synchronizacja zegara. Tak oto moje pytania:

1) Jeśli wszystkie procesy są na tym samym komputerze, czy jest zagwarantowane, że currentTimeMilis byłby dokładny w czasie połączenia? Czy są jakieś błędy związane z błędami ITP?

2) Jeśli niektóre procesy mogą znajdować się na różnych urządzeniach, czy istnieje gotowe do użycia rozwiązanie (również bezpłatne lub z otwartym kodem źródłowym) do synchronizacji zegara? Preferuję rozwiązanie, które może ominąć system operacyjny (Windows lub Linux) i pracować bezpośrednio z poziomu Javy. Idealnie szukam czegoś, co może działać z dokładnością do mikrosekundy. Myślałem o NTP, ale nie jestem pewien, czy jest on dostępny przez Javę, a nie przez system operacyjny, i nie jestem pewien jego złożoności.

3) Czy istnieje sposób określenia marginesu błędu w korzystaniu z NTP w konkretnej konfiguracji (lub dowolnego rozwiązania, z którego korzystam), aby dać margines błędu w obliczeniach opóźnienia?

Dzięki!

Odpowiedz

4

Przy programowaniu rozproszonym synchronizacja zegara często nie wystarcza. możesz zbudować logiczne ramy czasowe (takie jak Lamport lub zegary wektorowe lub Singhal-Kshemkalyani) i istnieje wiele innych czynników, które utrzymują przyczynowość w synchronizacji między maszynami). To, co wybierzesz, zależy często od zastosowania i wymaganej przyczynowości między zdarzeniami.

Zegary są synchronizowane, aby zapewnić, że zdarzenia współbieżne są przechowywane we właściwej kolejności. Są na to inne sposoby niż synchronizacja zegara systemowego ... która, chyba że mają wspólny zegar fizyczny ... jest dość trudna.

Pod względem NTP marginesem błędu, istnieją rozwiązania:

moje zalecenie:

Odczyt: Distributed Computing: Zasady, Algorytmy i Systemy

Zwłaszcza: Rozdział 3, logiczne czasowe

Edytuj

nawiązaniu do postu Cheeso za znalazłem

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

http://sourceforge.net/projects/freedce

Nie może Wiązania DCE Java tam.

+0

Pamiętam książkę z college'u. Nasz projekt w tej chwili szuka czegoś szybkiego i dostatecznie dokładnego, nie możemy być pierwszymi ludźmi, którzy potrzebują czegoś takiego. Zastanawiałam się, czy istnieje możliwość wprowadzenia na półkę. – Uri

+0

Nie wiem, ale z JVM będzie dużo opóźnień. Środowisko programu nie jest silnie sprzężone i może zawiesić się (w GC i tak dalej). Nie jestem jednak ekspertem od Javy. –

0

Dawne urządzenie DCE ("Distributed Computing Environment") miało rozproszone rozwiązanie synchronizacji czasu z wszystkimi tymi możliwościami. Nazywało się to DTS. Administrator może skonfigurować zestaw komputerów do synchronizacji, a opóźnienie lub niepewność zostały obliczone i dostępne. Jeśli jakikolwiek komputer nie był zsynchronizowany, jego zegar był powoli dostosowywany, dopóki nie został ponownie zsynchronizowany. Była gwarancja, że ​​czas na jakiejkolwiek maszynie nigdy nie zostanie skorygowany wstecz (z pogwałceniem podstawowej fizyki). Sieć wymagała co najmniej jednego wejścia NTP, aby pozostać zsynchronizowanym z "prawdziwym światem".

Nie wiem, co stało się z synchronizacją czasu lub ogólnie z kodem DCE.

Wydaje mi się, że nie potrzebujesz rozwiązania "w Javie". Musisz zsynchronizować zegary zestawu rozproszonych maszyn. Aplikacja Java jest właśnie tym, co działa na komputerach.

+0

Rozumiem, że większość systemów operacyjnych używa metody synchronizacji z dużym marginesem błędów (około 10-100ms), co jest dopuszczalne w przypadku większości praktyk. Myślałem o zrobieniu tego przez Javę, ponieważ mogę być w stanie użyć usługi z większą dokładnością. – Uri

+0

@Cheeso - DCE wyprzedziło swój czas :) –

+0

@Uri - tak, widzę, że chcesz rozwiązania o wyższej dokładności. Chciałem tylko powiedzieć, że synchronizacja może być możliwa niezależnie od kodu Java. Może być możliwe całkowite wyeliminowanie części synchronizacji czasu z aplikacji Java, więc założeniem projektu w aplikacji Java jest "synchronizacja czasu". Ale wybór należy do ciebie! b – Cheeso

2

Naprawdę po prostu użyłbym NTP. Jest dość dokładny nawet przez Internet, a w sieci LAN powinien być jeszcze lepszy. Według Wikipedii [1], ],

NTPv4 może zwykle utrzymywać czas w granicach 10 milisekund (1/100 s) przez publiczny Internet i może osiągnąć dokładność 200 mikrosekund (1/5000 s) lub lepszą w sieciach lokalnych w idealnych warunkach.

, więc może być wystarczająco dobre dla twoich potrzeb, jeśli twoje warunki są "wystarczająco" idealne. NTP jest na tyle długo, że prawie wszystko z nim pracuje. Nie widzę powodu, aby robić to za pośrednictwem Java, a nie systemu operacyjnego. Jeśli system operacyjny jest zsynchronizowany, będzie to także Java.

[1] Wikipedia: Network Time Protocol

Powiązane problemy