Che cos'è un metodo di timestamp accettato in un sistema distribuito?

3

In una normale applicazione, una semplice chiamata a time.Now() nella maggior parte delle lingue è sufficiente per ottenere un timestamp, ma cosa succede in un'applicazione web distribuita su più server? A quanto ho capito, time.Now() utilizzerà l'ora corrente del sistema, ma non c'è un modo affidabile di dire dopo il fatto se quel tempo fosse sincronizzato con il resto delle macchine. A questo punto, i dati vengono archiviati nell'archiviazione persistente con timestamp incoerenti che non è un problema per i tempi creati / modificati durante l'inserimento in un database, ma un problema più grande durante il monitoraggio dei tempi degli eventi).

Il modo migliore che vedo per mitigare questo è quello di far sì che tutte le macchine richiedano un timestamp da una specifica macchina "master", ma poi ho pensato alla latenza? Cosa succede se la rete è occupata e la risposta è in ritardo? Ci sono molti difetti con questo metodo, ma non posso pensare ad un altro più affidabile che usare la CPU e le risorse di rete sincronizzando l'ora ogni pochi secondi.

Qual è la migliore pratica accettata / standard del settore qui?

    
posta leylandski 03.09.2015 - 13:10
fonte

3 risposte

7

La pratica abituale è quella di impostare i server a mantenere tutti i loro tempi aggiornati tramite NTP. Ci sono limitazioni all'accuratezza quando si utilizza la sincronizzazione dell'ora NTP, il che significa che si deve fare affidamento solo sul timestamp per dare un'idea generale di quando si sono verificati gli eventi, il che è probabilmente sufficiente per identificare l'insieme di eventi a cui si è interessati.

Le registrazioni cronologiche non sono utili per determinare la sequenza di eventi, anche su un singolo server ad un livello di precisione, poiché anche con un intervallo di microsecondi, ogni core CPU elaborerà migliaia di istruzioni assembler durante lo stesso timestamp. Il tuo server potrebbe avere 40 di questi core.

L'approccio migliore che conosco, per tenere traccia di ciò che sta accadendo in un sistema distribuito è quello di utilizzare l'ID di transazione e file di registro. Un singolo file di registro scritto sequenzialmente consente di determinare l'ordine degli eventi su un singolo server. Qualsiasi cosa che passa il lavoro tra i server dovrà apparire nei log su entrambi i server che registrano il trasferimento del lavoro con un ID di transazione condivisa.

    
risposta data 03.09.2015 - 15:38
fonte
1

oltre ad avere un time server da cui dovrebbe provenire ogni timestamp (con l'enorme sovraccarico delle prestazioni nel traffico di rete che può generare)?
La prassi abituale è a) non disturbare o b) avere procedure in atto che assicurano che gli orologi di tutte le macchine siano sincronizzati da un unico server centrale NTP.

    
risposta data 03.09.2015 - 13:13
fonte
1

Come menzionato nel commento di @ jwenting , NTP è fondamentalmente lo "standard accettato". Ma se la latenza è molto critica per te, forse TICSync è un'opzione utile. Raggiunge la precisione di millisecondi molto rapidamente e viene utilizzato nei sistemi di robotica in cui è richiesta un'elevata precisione di sincronizzazione, oltre a ciò che NTP può offrire.

    
risposta data 03.09.2015 - 15:39
fonte

Leggi altre domande sui tag