В настоящее время я пытаюсь создать приложение, которое по своей природе нуждается в хорошей синхронизации времени на сервере и на каждом клиенте. Существуют альтернативные схемы для моего приложения, которые могут покончить с этой необходимостью синхронизации, но мое приложение быстро начинает сосать, когда его нет.
В случае, если я что-то упустил, моя основная проблема заключается в следующем: запуск события в нескольких местах в один и тот же момент. Насколько я могу судить, единственный способ сделать это требует некоторой синхронизации времени, но я могу ошибаться. Я пытался смоделировать проблему по-другому, но все возвращается к а) плохому приложению или б) необходимости синхронизации времени.
Давайте предположим, что мне действительно нужно синхронизированное время.
Мое приложение построено на 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 или более, могли запускать событие в одно и то же время.