Domanda

sto cercando in scrittura di una semplice capacità di sincronizzazione nella mia app e una delle preoccupazioni che ha spuntato è la sincronizzazione di tempo tra due computer remoti, ognuno con il proprio orologio (in particolare per quanto riguarda le date di modifica di file / oggetti ).

Sono sicuro che un sacco di ricerca è stato fatto su questo argomento e non voglio arrivare troppo teorica, ma mi chiedo se ci sono accettati best practice per ridurre le discrepanze temporali tra orologi remoti?

Per esempio, un inizio è di usare sempre il tempo universale (UTC), come che evita i problemi di fuso orario, ma non v'è alcuna garanzia che due computer avranno esattamente la stessa ora del sistema. Per fortuna il lavoro che sto facendo non è molto a grana fine, quindi non è un problema terribilmente importante, ma io sono ancora curioso comunque.

Una soluzione sarebbe quella di utilizzare sempre lo stesso orologio su entrambe le estremità, come ad esempio un server di tempo globale, piuttosto che l'orologio di sistema locale. Presumibilmente questo (in combinazione con serrature di risorse condivise) poteva garantire alcuna sovrapposizione accidentale di tempo sincronizzato, ma non è molto pratico.

Un pensiero che appena venuto in mente sarebbe quello di sincronizzare ogni nodo (ogni cliente), con un offset calcolati ad un certo punto, prima, forse calcolando l'offset del clock di sistema con un server di tempo globale. Ciò avrebbe bisogno solo di essere fatto di tanto in tanto come la stessa di offset non sarebbe probabile cambiamento notevolmente nel corso di un breve periodo di tempo.

Aggiornamento: Vorrei solo aggiungere che io non sono interessato a realtà sincronizzare gli orologi di sistema di due computer - I'll presumere che il sistema operativo in grado di gestire questo nella maggior parte dei casi. Questa è solo una questione di come garantire due istanze di un'applicazione sta utilizzando tempi sincronizzati, anche se in questo giorno di età e suppongo che il sistema di orologi sarebbe quasi certamente essere sincronizzati entro alcuni molto piccolo delta comunque.

È stato utile?

Soluzione

Basandosi su NTP per la vostra applicazione, come altri hanno consigliato è il fondente facile. L'approccio corretto è quello di utilizzare l'algoritmo sincronizzazione dell'orologio distribuita di Lamport. E 'spiegato nel suo classico 1978 della carta Tempo, orologi , e l'ordine degli eventi in un sistema distribuito .

Altri suggerimenti

Look at " Network Time Protocol " (NTP) specifica.

Si può provare PTP, il Precision Time Protocol (PTP) è un protocollo utilizzato per sincronizzare gli orologi per tutta una rete di computer. Su una rete locale raggiunge precisione dell'orologio nell'intervallo sub-microsecondo, lo rende adatto per sistemi di misura e controllo. http://en.wikipedia.org/wiki/Precision_Time_Protocol

Invece di scrivere codice per sincronizzare gli orologi, non sarebbe possibile eseguire solo un client NTP su entrambe le macchine?

In alternativa, se quanto sopra non è possibile e la vostra applicazione è in esecuzione con privilegi sufficienti per impostare l'ora, sarei tentato di implementare un minimo cliente giusto NTP nella domanda e cercare di sincronizzare un server pubblico. Basta non hardcode server privato di qualcuno in ...

NTP Network Time Protocol.

Quale piattaforma stai?

Con NTP è possibile sincronizzare l'ora dei computer con gli orologi atomici e utilizzare il tempo ufficiale del mondo.

Questo è un problema Al momento ho da risolvere per quanto riguarda sofisticati utenti finali che possono fare molte cose a sconvolgere i suggerimenti ragionevoli fatte dai collaboratori precedenti. Un sofisticato utente finale può fare almeno queste cose, e molto altro ancora:

1) Non avere conoscenza di calcolo sufficiente per essere in grado di impostare la sincronizzazione dell'ora NTP

2) Impostare il loro orologio tempo al computer ad un orologio casa o un orologio telefono cellulare che non è corretto

3) In Windows XP disattivare accidentalmente ntp sincronizzazione tempo e non so come abilitare di nuovo, o hanno la loro data del computer impostato erroneamente, nel qual caso di Windows NTP non funziona

4) La batteria BIOS del computer è diventato piatto in modo che il pc si avvia sempre nel 1970!

5) L'utente prende il loro computer portatile all'estero temporaneamente imposta l'orologio portatile per l'ora locale, ma non cambia il fuso orario, così ora il pc tornerà ora UTC non corretta !!!

Così il vostro programma stesso dovrà gestire il tempo, e, naturalmente, si consiglia di farlo con minimo overhead.

Supponiamo che due utenti finali che eseguono i programmi necessari i programmi di fare qualcosa allo stesso tempo assoluto in futuro.

Vi propongo questo schema, che prende alcune idee dal modo in cui cron jobs lavoro, sarei felice se qualcuno può suggerire miglioramenti per l'idea.

1) Quando l'applicazione si avvia, si sincronizza la propria ora UTC interno per NTP tramite una chiamata sapone per un server di terze parti o al server di tempo proprio (che potete voi stessi continuare a tempo con NTP).

2) Dopo che si aggiunge il tempo trascorso dal clock di sistema per mantenere il tempo. Se i requisiti sono stringenti potrebbe essere necessario ripetere la sincronizzazione NTP a intervalli.

3) La domanda poi guarda un elenco di futuri posti di lavoro che ha bisogno di fare in tempo. Ha bisogno di conoscere il primo lavoro.

4) Si crea quindi un filo che si mette a dormire per il periodo di tempo in vista del primo lavoro, meno un margine di sicurezza, che a seconda delle vostre esigenze potrebbe essere di 10 minuti di anticipo, una o due ore di anticipo, ecc .

5) Quando il filo si sveglia, si ricontrolla il tempo assoluto con un ulteriore invito di sapone, e poi si affida al orologio di sistema per aggiungere il tempo trascorso fino a raggiungere il momento in cui il primo lavoro deve essere effettuata.

6) Non appena il processo viene attivato (eseguirlo in un altro thread) il filo di tempo di monitoraggio calcola il tempo prossimo compito avanti e si mette a dormire per tutta la durata.

I miglioramenti apportati l'idea:

1) Un utente può chiudere l'applicazione prima che il lavoro a causa, quindi potrebbe essere necessario un processo in background o un servizio, che utilizza lo stesso schema di sincronizzazione sopra, per monitorare in modo indipendente le vostre liste di lavoro, memorizzati in un database o file, avviare l'applicazione nel tempo. (In Windows, generare il processo di applicazione)

2) L'applicazione potrebbe essere l'aggiunta di nuovi posti di lavoro, precedenti al volo, o l'eliminazione di posti di lavoro, in modo che il filo di sonno sarà probabilmente bisogno di essere wakeable per ricalcolare per il nuovo lavoro precedente, o per il lavoro a seguito del processo eliminato. In Win32 si dovrebbe fare questo tuo thread in attesa con timeout su un evento, che si imposta per costringerlo a ricalcolare il tempo di sonno. In Linux senza dubbio v'è un meccanismo simile.

3) Per la chiamata Soap per ottenere il tempo di tenere una nota di quando il sapone viene inviato e quando si riceve la risposta. Se il tempo di consegna è troppo lungo, non si può fare affidamento sul tempo e può essere necessario ripetere la chiamata, oppure si può scendere a compromessi. Ad esempio, se il sapone dice l'orologio del computer è di 5 minuti veloce, ma la chiamata Soap stesso volle un minuto per rispondere, allora si può solo dire con certezza che l'orologio del computer è di almeno 4 minuti veloce.

Una cosa che facciamo è essenzialmente scaricare tutte le operazioni di cronometraggio alla macchina 'ospite'. Ad esempio, se si dispone di 20 server che tutti condividano un DB, utilizzare il tempo del DB. Se si dispone di un server centrale e un milione di macchine client, quindi le macchine client non dovrebbero essere responsabili per la temporizzazione nulla; fare tutto il vostro lato server sincronizzazione. In un ambiente veramente 'distribuito', come una rete P2P o qualcosa del genere, utilizzare la macchina che più direttamente 'possiede' la risorsa in questione (il PC vero e proprio il file che si desidera scrivere) per sincronizzare l'accesso / controllo al file.

qualsiasi macchina in rete dovrebbe usare NTP. tutti i sistemi moderni sono un modo semplice per configurare questo. l'unico problema dovrebbe essere la scelta di un server specifico, se avete bisogno di un po 'di precisione in più; ma è già in millisecondi, quindi non mi interessa e di solito basta puntare a pool.ntp.org

Non utilizzare NTP. NTP è per ottenere unica data / ora.

Si lavora per sincronizzare gli eventi tra le applicazioni che non comunicano. Un'app di allarme e il tuo corpo, per esempio.

Per le applicazioni che hanno la comunicazione diretta, la condivisione di una risorsa, utilizzare orologi Lamport o orologi vettoriali come diceva Diomidis. orologi Lamport grande lavoro per ottenere un ordine parziale tra gli eventi, gli orologi vettoriali sono grandi quando è necessario identificare eventi concomitanti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top