Синхронизация (из часов) между двумя удаленными компьютерами

StackOverflow https://stackoverflow.com/questions/389417

  •  23-08-2019
  •  | 
  •  

Вопрос

Я собираюсь написать простую способность синхронизации в своем приложении, и одной из выскакнутых проблем является синхронизация времени между двумя удаленными компьютерами, каждая из которых со своими часами (в частности, касается дат модификации файлов/объектов).

Я уверен, что много исследований было проведено по этой теме и не хочу получать слишком теоретические, но мне интересно, есть ли какие -либо принятые передовые практики для минимизации временных расхождений между удаленными часами?

Например, начало - всегда использовать Universal Time (UTC), поскольку это позволяет избежать проблем с часовым поясом, но нет никакой гарантии, что два компьютера будут иметь точно одинаковое системное время. К счастью, работа, которую я выполняю, не очень мелкозернистая, так что это не очень важная проблема, но, тем не менее, мне все еще любопытно.

Одним из решений было бы всегда использовать одни и те же часы на обоих концах, например, глобальный сервер времени, а не локальные системные часы. Предположительно, это (в сочетании с общими блокировками ресурсов) не может гарантировать отсутствие случайного совпадения синхронизированного времени, но это не очень практично.

Одна мысль, что только что появилось в моей голове, - это синхронизировать каждый узел (каждого клиента) с смещением, рассчитанным в какой -то момент ранее, возможно, путем расчета смещения системных часов с глобальным сервером времени. Это должно быть сделано только иногда, так как само смещение вряд ли сильно изменится в течение короткого периода времени.

Обновлять: Позвольте мне добавить, что я не заинтересован в на самом деле синхронизировать системные часы двух компьютеров-я предполагаю, что операционная система будет обрабатывать это в большинстве случаев. Это всего лишь вопрос о том, как обеспечить использование двух экземпляров приложения, хотя в наше время, я полагаю, что системные часы почти наверняка будут синхронизированы с некоторой очень маленькой дельтой в любом случае.

Это было полезно?

Решение

Полагаться на NTP для вашего приложения, как рекомендовали другие, - это простая подушка. Правильный подход заключается в использовании алгоритма синхронизации распределенных часов LAMPORT. Это объяснено в его классической газете 1978 года Время, часы и заказ событий в распределенной системе.

Другие советы

Смотреть на "Протокол сети"(NTP) спецификация.

Вы можете попробовать PTP, протокол точности времени (PTP) - это протокол, используемый для синхронизации часов в компьютерной сети. В локальной сети он достигает точности часов в диапазоне субмикросекунды, что делает его подходящим для систем измерения и управления.http://en.wikipedia.org/wiki/precision_time_protocol

Вместо того, чтобы писать код для синхронизации часов, разве невозможно просто запустить клиент NTP на обеих машинах?

В качестве альтернативы, если вышеперечисленное невозможно, и ваше приложение работает с достаточными привилегиями для установления времени, у меня будет искушение реализовать минимальный клиент NTP прямо в приложении и попытаться синхронизировать его с общедоступным сервером. Только не жестко кодировать чей -то частный сервер в ...

Синхронизировать их с НТП Протокол сети.

На какой платформе вы?

С NTP вы можете синхронизировать время своих компьютеров с атомными часами и использовать официальное время мира.

Это проблема, которую я в настоящее время должен решить в отношении неискушенных конечных пользователей, которые могут сделать много вещей, чтобы расстроить разумные предложения, сделанные предыдущими участниками. Неиганный конечный пользователь может делать хотя бы эти вещи, и многое другое:

1) Недостаточно вычислительных знаний, чтобы иметь возможность настроить синхронизацию времени NTP

2) Установите свои компьютерные часы на часы домашнего или мобильного телефона, которые неверны

3) В Windows XP случайно отключите синхронизацию времени NTP и не знает, как включить его снова, или установить неверную дату компьютера, и в этом случае Windows NTP не работает

4) Батарея Computer Bios стала плоской, поэтому ПК всегда запускается в 1970 году!

5) Пользователь берет свой ноутбук за границу и временно устанавливает часы ноутбука в местное время, но не меняет часовой пояс, поэтому теперь ПК вернет неправильное время UTC !!!

Таким образом, ваша программа должна будет управлять временем, и, конечно, вы хотите сделать это с минимальными накладными расходами.

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

Я предлагаю эту схему, которая берет некоторые идеи с того, как работают работы Cron, я был бы рад, если бы кто -то мог предложить улучшения этой идеи.

1) Когда ваше приложение запускается, он синхронизирует свое собственное внутреннее время UTC, чтобы NTP с помощью SOAP CALL на сторонний сервер или на ваш собственный сервер времени (который вы сами можете сохранить время с NTP).

2) После этого он добавляет в прошедшее время от системных часов, чтобы сохранить время. Если требования являются строгими, вам может потребоваться повторить синхронизацию NTP с интервалами.

3) Затем в приложении рассматривается список будущих рабочих мест, которые ему необходимо выполнить вовремя. Это должно знать самую раннюю работу.

4) Затем он создает нить, которую он укладывает спать в течение долгого времени, опережая самую раннюю работу, меньше запаса безопасности, которая в зависимости от ваших требований может быть за 10 минут заранее, за час или два и т. Д.

5) Когда нить просыпается, она перепроверяет абсолютное время с помощью еще одного вызова мыла, а затем полагается на системные часы, чтобы добавить в истеченное время, пока не достигнет времени, когда первая работа должна быть выполнена.

6) Как только задание запускается (запустите его в другом потоке), поток мониторинга времени вычисляет следующее время задачи впереди и снова засыпает.

Улучшения этой идеи:

1) Пользователь может закрыть ваше приложение до выполненной работы, поэтому вам может потребоваться фоновый процесс или служба, которая использует ту же схему синхронизации выше, чтобы независимо контролировать свои списки заданий, хранится в базе данных или файле и запустите применение во времени. (В Windows, создать процесс применения)

2) Ваше заявление может добавлять новые, более ранние задания на лету или удаление рабочих мест, поэтому, вероятно, вам потребуется разобраться с новой предыдущей работой или за работу после удаленной работы. В Win32 вы сделаете это благодаря вашей ветке с ожиданием тайм -аута на мероприятии, которое вы настроили, чтобы заставить его пересчитать время сна. В Linux, без сомнения, есть аналогичный механизм.

3) Для мыла вызов, чтобы получить время, запомните, когда мыло отправляется и когда ответ получен. Если время выполнения выполнения слишком длинного, вы не можете полагаться на время и, возможно, потребуется повторить вызов, или вы можете пойти на компромисс. Например, если мыло говорит, что компьютерные часы быстро на 5 минут, но сам вызов SOAP занял минуту, чтобы ответить, то вы можете только сказать, что компьютерные часы быстро на 4 минуты.

Одна вещь, которую мы делаем, - это, по сути, разгрузить все операции времени на машину «хост». Например, если у вас есть 20 серверов, в которых все разделяют БД, используйте время БД. Если у вас есть центральный сервер и миллион клиентских машин, то клиентские машины не должны нести ответственность за что -либо; Сделайте всю свою синхронизацию сервера. В действительно «распределенной» среде, такой как сеть P2P или что -то в этом роде, используйте машину, которая наиболее напрямую владеет рассматриваемым ресурсом (фактический компьютер, который вы хотите написать) для синхронизации/управления доступом к файлу.

Любая сетевая машина должна использовать NTP. Все современные системы включают в себя простой способ настроить это. Единственной проблемой должен быть выбор конкретного сервера, если вам нужна небольшая дополнительная точность; Но это уже в миллисекундном диапазоне, поэтому мне все равно и обычно просто указывают на pool.ntp.org

Не используйте NTP. NTP предназначен только для получения даты/времени.

Он работает для синхронизации событий между приложениями, которые не общаются. Например, приложение для сигнализации и ваше тело.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top