erniesto77
@erniesto77
oop, rb, py, php, js

Точное время на сервере с интервалом в 1 секунду?

Пытаюсь получить "тикающий" сервер с точным или почти точным периодом в 1 секунду для получения относительно точного времени с погрешностью не более 1 секунды.
Есть контроллер example.com/timer на который nodejs с интервалом 1000мс отправляет текущее время. Затем с контроллера время выводится в браузер:
var request = require('request');

var requestLoop = setInterval(function() {
	var time = Math.round(+new Date()/1000);

	request({
		url: "http://example.com/timer",
		method: "POST",
    data: {time: time},
		followRedirect: false
	});
}, 1000);

Первую неделю все работает нормально, время "тикает", но через неделю время в браузере начинает постепенно спешить и за неделю разница с настоящим временем возрастает примерно до 4-5 секунд. Получается что setInterval в данном случае работает чуть-чуть быстрее чем 1000мс? Можно ли каким то способом добиться того, чтобы получать всегда точное время на сервере?
Уже несколько месяцев интересуюсь этим вопросом и знающие люди подсказывали что для того чтобы получить точные периоды в 1 секунду надо найти сервер с частотой кратной 60, а таких не бывает и все плохо. Но ведь есть же в интернете сервисы в которых отображается точное время и оно никогда не спешит". Видимо как то нужно сглаживать погрешность в промежутках между запросами, которая накапливается со временем. Есть какие нибудь идеи?

UPD: подробнее: setInterval постоянно крутится на nodejs сервере, отправляя запросы на контроллер timer, который находится на laravel.
Как выводится время в браузер: контроллер timer по запросу пушит время клиентам (вебсокет), а на клиенте выводится в читаемом формате в браузер.
Проблема в том что setInterval после 1-2 недели работы показывает время на 4-5 секунд больше актуального времени
  • Вопрос задан
  • 678 просмотров
Решения вопроса 1
Вы неправильно выбрали технологию (асинхронным "молотком" пытаетесь синхронизировать "гвозди").
Современные системы достаточно хорошо научились синхронизировать время, вот пусть ОС и занимается этим.

ps. Учтите, что функции "отложенного" вызова работают не точно. Вызов (setTime(fn, 100)) может произойти через 100 м.с. или через 1200 (это зависит от загруженности основного цикла node.js).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы