В настоящее время я пытаюсь создать приложение, которое по своей сути требует хорошей синхронизации времени на сервере и на каждом клиенте. Для моего приложения есть альтернативные конструкции, которые могут избавить от этой потребности в синхронизации, но мое приложение быстро начинает отстой, когда его нет.
Если мне чего-то не хватает, моя основная проблема заключается в следующем: запуск события в нескольких местах в один и тот же момент. Насколько я могу судить, единственный способ сделать это требует какой-то синхронизации времени, но я могу ошибаться. Я пробовал моделировать проблему по-другому, но все сводится к а) отстойному приложению или б) требующему синхронизации времени.
Предположим, мне действительно действительно нужно синхронизированное время.
Мое приложение построено на Google AppEngine. Хотя AppEngine не дает никаких гарантий относительно состояния синхронизации времени на своих серверах, обычно это неплохо, порядка нескольких секунд (т.е. лучше, чем NTP), однако иногда это плохо, скажем, порядка 10 секунд. синхронизации. Мое приложение может обрабатывать 2-3 секунды рассинхронизации, но о 10 секундах не может быть и речи с точки зрения взаимодействия с пользователем. В общем, выбранная мной серверная платформа не обеспечивает очень надежную концепцию времени.
Клиентская часть моего приложения написана на JavaScript. Опять же, у нас есть ситуация, когда клиент также не имеет надежного представления о времени. Я не проводил никаких измерений, но полностью ожидаю, что у некоторых из моих потенциальных пользователей будут компьютерные часы, настроенные на 1901, 1970, 2024 и так далее. В общем, моя клиентская платформа не дает надежного представления о времени.
Эта проблема начинает меня немного бесить. Пока что лучшее, что я могу придумать, - это реализовать что-то вроде NTP поверх HTTP (это не так безумно, как может показаться). Это будет работать путем ввода в эксплуатацию 2 или 3 серверов в разных частях Интернета и использования традиционных средств (PTP, NTP), чтобы попытаться обеспечить их синхронизацию, по крайней мере, порядка сотен миллисекунд.
Затем я бы создал класс JavaScript, который реализовал алгоритм пересечения NTP, используя эти источники времени HTTP (и связанную информацию о двустороннем обращении, доступную из XMLHTTPRequest).
Как видите, это решение тоже отстой. Это не только ужасно сложно, но и решает только половину проблемы, а именно дает клиентам хорошее представление о текущем времени. Затем я должен пойти на компромисс на сервере, либо разрешив клиентам сообщать серверу текущее время в соответствии с ними, когда они делают запрос (большая безопасность нет-нет, но я могу смягчить некоторые из наиболее очевидных злоупотреблений этим), или заставить сервер сделать один запрос к одному из моих волшебных серверов HTTP-over-NTP и надеяться, что этот запрос завершится достаточно быстро.
Все эти решения - отстой, и я потерялся.
Напоминание: я хочу, чтобы несколько веб-браузеров, надеюсь, их было 100 или больше, могли запускать событие в одно и то же время.