Есть ли готовое решение для синхронизации часов для Java?
У нас есть большая высокопроизводительная программная система, которая состоит из нескольких взаимодействующих Java-процессов (не EJB). Каждый процесс может быть на одной и той же машине или на другой машине.
Определенные события генерируются в одном процессе, а затем по-разному распространяются на другие процессы для дальнейшей обработки и так далее.
Для целей бенчмаркинга нам нужно создать журнал, когда каждое событие прошло через "контрольную точку", в конечном итоге объединить эти журналы, чтобы получить временную шкалу того, как каждое событие распространяется через систему и с какой задержкой (конечно, переключение процессов и IPC добавляет задержка, которая в порядке).
Проблема, конечно же, в синхронизации часов. Итак, вот мои вопросы:
1) Если все процессы находятся на одной машине, гарантируется ли, что currentTimeMilis будет точным во время вызова? Есть ли какие-то ограничения на ошибки ITP?
2) Если некоторые процессы могут быть на разных машинах, есть ли готовое решение (то есть бесплатное или с открытым исходным кодом) для синхронизации часов? Я предпочтительно ищу решение, которое может обойти операционную систему (Windows или Linux) и работать прямо с Java. Я также в идеале ищу что-то, что может работать с точностью до микросекунды. Я думал о NTP, но я не уверен, доступен ли он через Java, а не через ОС, и я не уверен в его сложности.
3) Есть ли способ определить предел погрешности при использовании NTP в конкретной конфигурации (или в любом решении, которое я в итоге использую), чтобы я мог дать предел погрешности при нашем расчете задержки?
Спасибо!
4 ответа
При распределенном программировании синхронизации часов часто недостаточно. Возможно, вы захотите построить логическую временную структуру (такую как Lamport или векторные часы или методы Singhal-Kshemkalyani... и есть множество других вещей, чтобы синхронизировать причинность между машинами). То, что вы выбираете, часто зависит от приложения и требуемой причинно-следственной связи между событиями.
Часы синхронизируются, чтобы гарантировать, что параллельные события хранятся в правильном последовательном порядке. Есть и другие способы сделать это, кроме как синхронизировать системные часы... что, если они не используют общие физические часы... довольно сложно.
С точки зрения погрешности NTP, есть решения:
моя рекомендация:
Читайте:Распределенные вычисления: принципы, алгоритмы и системы
Особенно: Глава 3, логическое время
редактировать
В дополнение к посту Cheeso, я нашел
http://www.uniforum.org/publications/ufm/apr96/opengroup.html
http://sourceforge.net/projects/freedce
Там может быть DCE Java привязки там.
Я бы просто использовал NTP. Это довольно точно даже через Интернет, а в локальной сети должно быть еще лучше. Согласно Википедии [ 1],
NTPv4 обычно может поддерживать время в пределах 10 миллисекунд (1/100 с) через общедоступный Интернет и может достигать точности 200 микросекунд (1/5000 с) или выше в локальных сетях при идеальных условиях.
так что это может быть достаточно для ваших нужд, если ваши условия достаточно "идеальны". NTP существует достаточно долго, и с ним практически все работает. Я не вижу причин делать это через Java, а не через ОС. Если ОС синхронизируется, то будет и Java.
Я столкнулся с этой веткой после того, как попробовал что-то самостоятельно (должен был сначала поискать!) http://snippets.dzone.com/posts/show/11345 - может быть хорошим методом, может быть плохим, но он распространяется (без сервера), который это мило.
В старом DCE ("Распределенная вычислительная среда") использовалось решение распределенной синхронизации времени со всеми этими возможностями. Это называлось DTS. Администратор мог настроить набор машин для синхронизации, а время ожидания или неопределенность были рассчитаны и доступны. Если какая-либо машина вышла из синхронизации, ее часы медленно настраивались до тех пор, пока они снова не были синхронизированы. Была гарантия, что время на любой машине никогда не будет изменено в обратном направлении (в нарушение базовой физики). В сети требовался хотя бы один вход NTP, чтобы синхронизироваться с "реальным миром".
Я не знаю, что случилось с тем синхронизирующим материалом или кодом DCE в целом.
Мне кажется, вам не нужно решение "на Java". Вам необходимо синхронизировать часы набора распределенных машин. Java-приложение - это то, что работает на машинах.