Есть ли готовое решение для синхронизации часов для Java? - PullRequest
8 голосов
/ 02 июня 2009

У нас есть большая высокопроизводительная программная система, которая состоит из нескольких взаимодействующих Java-процессов (не EJB). Каждый процесс может быть на одной и той же машине или на другой машине.

Некоторые события генерируются в одном процессе, а затем по-разному распространяются на другие процессы для дальнейшей обработки и т. Д.

Для целей бенчмаркинга нам нужно создать журнал, когда каждое событие прошло через «контрольную точку», в конечном итоге объединить эти журналы, чтобы получить временную шкалу того, как каждое событие распространялось через систему и с какой задержкой (конечно, переключение процессов и IPC добавляет задержку, что нормально).

Проблема, конечно же, в синхронизации часов. Итак, вот мои вопросы:

1) Если все процессы выполняются на одном компьютере, гарантируется ли, что currentTimeMilis будет точным во время вызова? Есть ли какие-то ограничения на ошибки ITP?

2) Если некоторые процессы могут быть на разных машинах, есть ли готовое решение (то есть бесплатное или с открытым исходным кодом) для синхронизации часов? Я предпочтительно ищу решение, которое может обойти операционную систему (Windows или Linux) и работать прямо с Java. Я также в идеале ищу что-то, что может работать с точностью до микросекунды. Я думал о NTP, но я не уверен, доступен ли он через Java, а не через ОС, и я не уверен в его сложности.

3) Есть ли способ определить предел погрешности при использовании NTP в конкретной конфигурации (или в любом решении, которое я в конечном итоге использую), чтобы я мог дать предел погрешности при нашем вычислении задержки?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 02 июня 2009

При распределенном программировании синхронизации часов часто недостаточно. Возможно, вы захотите построить логическую временную структуру (такую ​​как Lamport или векторные часы или методы Singhal-Kshemkalyani ... и есть множество других вещей, чтобы синхронизировать причинность между машинами). То, что вы выбираете, часто зависит от приложения и требуемой причинно-следственной связи между событиями.

Часы синхронизируются, чтобы гарантировать, что параллельные события хранятся в правильном последовательном порядке. Есть и другие способы сделать это, кроме как синхронизировать системные часы ... что, если они не используют общие физические часы ... довольно сложно.

С точки зрения погрешности NTP, есть решения:

моя рекомендация:

Читать: Распределенные вычисления: принципы, алгоритмы и системы

Особенно: Глава 3, логическое время

Редактировать

В дополнение к сообщению Чизо я нашел

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

http://sourceforge.net/projects/freedce

Возможно, там есть привязки DCE Java.

2 голосов
/ 02 июня 2009

Я бы просто использовал NTP. Это довольно точно даже через Интернет, а в локальной сети должно быть еще лучше. Согласно Википедии [ 1 ],

NTPv4 обычно может поддерживать время в пределах 10 миллисекунд (1/100 с) через общедоступный Интернет и может достигать точности 200 микросекунд (1/5000 с) или выше в локальных сетях при идеальных условиях.

так что это может быть достаточно для ваших нужд, если ваши условия достаточно "идеальны". NTP существует достаточно долго, и с ним практически все работает. Я не вижу причин делать это через Java, а не через ОС. Если ОС синхронизируется, то будет и Java.

[1] Википедия: Сетевой протокол времени

1 голос
/ 15 мая 2010

Я столкнулся с этой темой после того, как попробовал что-то самостоятельно (должен был сначала поискать!) http://snippets.dzone.com/posts/show/11345 - может быть хорошим методом, может быть плохим, но он распространяется (без сервера), что приятно.

0 голосов
/ 02 июня 2009

Старая DCE ("Распределенная вычислительная среда") использовала решение с распределенной синхронизацией времени со всеми этими возможностями. Это называлось DTS. Администратор мог настроить набор машин для синхронизации, а время ожидания или неопределенность были рассчитаны и доступны. Если какая-либо машина вышла из синхронизации, ее часы медленно настраивались до тех пор, пока они снова не были синхронизированы. Была гарантия, что время на любой машине никогда не будет изменено в обратном направлении (в нарушение базовой физики). В сети требовался хотя бы один вход NTP для синхронизации с «реальным миром».

Я не знаю, что случилось с тем синхронизирующим устройством или кодом DCE в целом.

Мне кажется, вам не нужно решение "на Java". Вам необходимо синхронизировать часы набора распределенных машин. Java-приложение - это то, что работает на компьютерах.

...