Обычно не сервер базы данных подвержен ошибкам при мгновенном скачке времени: это приложения, которые используют время.
Обычно существует два способа отслеживания времени: отслеживание собственного времени или сравнение системного времени. Оба имеют некоторые положительные и отрицательные компромиссы.
Собственное время отслеживания
Я вижу, что это используется в некоторых встроенных программах и системах, где точное время не так критично. В основном цикле приложения используется способ отслеживания «галочки». Это может быть сигнал тревоги, выданный ядром, сном или выбором, который показывает количество прошедшего времени. Когда вы знаете, сколько времени прошло, вы знаете, что можете прибавить или вычесть это время к счетчику. Этот счетчик - то, что заставляет Ваше приложение времени происходить. Например, если счетчик больше 10 секунд, вы можете что-то отменить или вам нужно что-то сделать.
Если приложение не отслеживает время, счетчик не изменится. Это может быть желательно в зависимости от дизайна вашего приложения. Например, отследить, сколько времени занимает длительный процесс, что-то обрабатывается, легче с помощью счетчика, чем список отметок времени запуска / остановки.
Pro:
- Не зависит от системных часов
- Не сломается на большой перекошенный момент
- Нет дорогостоящего системного вызова
- Маленькие счетчики будут стоить меньше памяти, чем полная отметка времени
Против:
- Время не очень точное
- Изменение системного времени может сделать его еще более неточным
- Сроки относительно запуска приложения, не сохраняется
Сравнение системного времени
Эта система используется чаще: сохраняйте временную метку и сравнивайте ее с временной меткой, используя системный вызов времени. Огромные перекосы в системном времени могут поставить под угрозу целостность вашего приложения, задача в несколько секунд может занять часы или завершиться немедленно, в зависимости от направления часов.
Pro:
- Точное сравнение времени
- Сохраняется после перезапусков и длительных отключений
Против:
- Делает системный вызов, чтобы получить новую временную метку для сравнения с другими временными метками
- Приложение должно быть осведомлено о перекосах или может сломаться
Затронутые системы
Большинство приложений будет использовать сравнение временных меток для планирования задач. Для систем баз данных это может быть очистка кеша.
Все приложения, которые используют базу данных и функции времени вызова на языке запросов, будут подвержены перекосам, если приложение не обнаружит и не обработает соответствующим образом. Приложения никогда не могут прекратить работу или разрешить неопределенные периоды входа в зависимости от его цели.
Почтовые системы будут использовать временные метки и / или тайм-ауты для обработки устаревших или недоставленных писем. На это может повлиять перекос часов, но с гораздо меньшим влиянием. Таймеры отсрочки в отношении повторного подключения к серверам могут быть пропущены, что приведет к штрафам на подключающемся сервере.
Я не думаю (не исследовал), что аварийные сигналы ядра сработают при изменении системного времени. Системы, которые их используют, могут быть безопасными.
Решения
Осторожно двигайте время. Это можно найти в документации вашего любимого решения времени.
now()
. Можете ли вы добавить какой-либо безопасный метод изменения времени в вашем ответе?