Di solito non è il server di database che è vulnerabile all'errore quando si verifica un salto temporale istantaneo: sono le applicazioni che usano il tempo che lo sono.
Esistono in genere due modi per tenere traccia del tempo: il monitoraggio del proprio tempo o il confronto del tempo di sistema. Entrambi hanno alcuni compromessi positivi e negativi.
Proprio monitoraggio del tempo
Lo vedo usato in alcuni sistemi e programmazioni integrate in cui il tempismo esatto non è così critico. In un ciclo applicativo principale viene preso in considerazione un modo per tracciare un 'tick'. Potrebbe trattarsi di un allarme dato dal kernel, sleep o select che fornisce un'indicazione del tempo trascorso. Quando sai a che ora passa, sai che puoi aggiungere o sottrarre questa volta a un contatore. Questo contatore è ciò che rende possibile l'applicazione di temporizzazione. Ad esempio, se il contatore è superiore a 10 secondi, puoi scartare qualcosa o devi fare qualcosa.
Se l'applicazione non tiene traccia del tempo, il contatore non cambierà. Questo potrebbe essere desiderato a seconda del design dell'applicazione. Ad esempio, tenere traccia di quanto tempo viene gestito un processo di lunga durata è più semplice con un contatore rispetto a un elenco di timestamp di avvio / arresto.
Pro:
- Non dipende dall'orologio di sistema
- Non si romperà su un grande disallineamento
- Nessuna costosa chiamata di sistema
- I contatori di piccole dimensioni costeranno meno memoria rispetto a un timestamp completo
con:
- Il tempo non è molto preciso
- La modifica dell'ora di sistema potrebbe renderla ancora più imprecisa
- Il tempismo è relativo all'esecuzione dell'applicazione, non persiste
Confronto del tempo di sistema
Questo è il sistema usato più spesso: memorizza un timestamp e confrontalo con il timestamp usando una chiamata di orario del sistema. Enormi disallineamenti nell'ora del sistema potrebbero minacciare l'integrità dell'applicazione, un'attività di alcuni secondi potrebbe richiedere ore o terminare immediatamente a seconda della direzione dell'orologio.
Pro:
- Confronto preciso dei tempi
- Persiste per riavvii e lunghe interruzioni
con:
- Riceve una chiamata di sistema per ottenere un nuovo timestamp da confrontare con altri timestamp
- L'applicazione deve essere consapevole delle inclinazioni o può rompersi
Sistemi interessati
La maggior parte delle applicazioni utilizzerà il timestamp rispetto alle attività di pianificazione. Per i sistemi di database che potrebbero essere operazioni di pulizia della cache.
Se l'applicazione non rileva e gestisce di conseguenza, tutte le applicazioni che utilizzano un database e le funzioni del tempo di chiamata nella lingua della query saranno interessate da errori. Le applicazioni non potrebbero mai smettere di funzionare o consentire periodi di accesso indefiniti a seconda del suo scopo.
I sistemi di posta utilizzeranno timestamp e / o timeout per la gestione di messaggi non aggiornati o non consegnati. Una inclinazione dell'orologio potrebbe influire su questo, ma con un impatto molto minore. I timer di back-off relativi alla riconnessione ai server potrebbero non essere rispettati, con conseguenti sanzioni per il server di connessione.
Non penso (non ho fatto ricerche) che gli allarmi del kernel si spegneranno quando si cambia l'ora di sistema. I sistemi che usano questi potrebbero essere sicuri.
soluzioni
Sposta delicatamente il tempo. Questo può essere trovato nella documentazione della tua soluzione temporale preferita.
now()
. Puoi aggiungere un metodo sicuro per modificare l'ora della risposta?