Por lo general, no es el servidor de la base de datos el que es vulnerable a errores cuando ocurre un salto de tiempo instantáneo: son las aplicaciones las que usan el tiempo.
En general, hay dos formas de realizar un seguimiento del tiempo: seguimiento del tiempo propio o comparación del tiempo del sistema. Ambos tienen algunas compensaciones positivas y negativas.
Seguimiento del tiempo propio
Veo esto usado en algunos programas y sistemas embebidos donde el tiempo exacto no es tan crítico. En un bucle de aplicación principal, se soluciona una forma de rastrear un 'tic'. Esto podría ser una alarma dada por el núcleo, suspensión o selección que da una indicación de la cantidad de tiempo transcurrido. Cuando sabes qué tiempo pasa, sabes que puedes sumar o restar este tiempo a un contador. Este contador es lo que hace que su aplicación de temporización suceda. Por ejemplo, si el contador es superior a 10 segundos, puede descartar algo o debe hacer algo.
Si la aplicación no registra el tiempo, el contador no cambiará. Esto puede desearse dependiendo del diseño de su aplicación. Por ejemplo, realizar un seguimiento de cuánto tiempo se está manejando un proceso de larga duración es más fácil con un contador que con una lista de marcas de tiempo de inicio / parada.
Pro:
- No depende del reloj del sistema
- No se romperá en un gran sesgo
- No hay llamadas al sistema costosas
- Los contadores pequeños costarán menos memoria que una marca de tiempo completa
Estafa:
- El tiempo no es muy preciso.
- El cambio en la hora del sistema podría hacerlo aún más inexacto
- El tiempo es relativo a la ejecución de la aplicación, no persiste
Comparación del tiempo del sistema
Este es el sistema que se usa con más frecuencia: almacene una marca de tiempo y compárela con la marca de tiempo utilizando una llamada de tiempo del sistema. Grandes sesgos en el tiempo del sistema podrían amenazar la integridad de su aplicación, una tarea de unos pocos segundos podría llevar horas o terminar de inmediato dependiendo de la dirección del reloj.
Pro:
- Comparación precisa de tiempo
- Persiste sobre reinicios y largas interrupciones
Estafa:
- Toma una llamada del sistema para obtener una nueva marca de tiempo para comparar con otras marcas de tiempo
- La aplicación debe ser consciente de los sesgos o puede romperse
Sistemas afectados
La mayoría de las aplicaciones usarán marcas de tiempo en comparación con las tareas programadas. Para sistemas de bases de datos que podrían ser limpiezas de caché.
Todas las aplicaciones que usan una base de datos y funciones de tiempo de llamada en el lenguaje de consulta se verán afectadas por sesgos si la aplicación no detecta y maneja en consecuencia. Las aplicaciones nunca podrían dejar de ejecutarse o permitir períodos de inicio de sesión indefinidos según su propósito.
Los sistemas de correo utilizarán marcas de tiempo y / o tiempos de espera para manejar correos obsoletos o no entregados. Un sesgo del reloj podría afectar eso, pero con un impacto mucho menor. Los temporizadores de retroceso relacionados con la reconexión a los servidores podrían perderse, lo que generaría penalizaciones en el servidor de conexión.
No creo (no he investigado) que las alarmas del kernel se activen al cambiar la hora del sistema. Los sistemas que usan estos podrían ser seguros.
Soluciones
Mueve el tiempo suavemente. Esto se puede encontrar en la documentación de su solución de tiempo favorita.
now()
. ¿Puedes agregar algún método seguro para cambiar el tiempo de tu respuesta?