Ho iniziato a esaminare gli approcci alla sincronizzazione dei dati tra una serie di peer. I peer devono essere in grado di lavorare in modo disconnesso e quindi sincronizzarsi insieme per unire le loro modifiche locali.
I peer dovrebbero essere in grado di unire gli aggiornamenti locali con una "fusione a tre vie" . Quindi, alla sincronizzazione, i peer dovrebbero sapere quali fatti sono più recenti, ma dove non esiste un ordinamento rigoroso, dovrebbero essere in grado di unire i fatti in base alla radice comune.
Quando i peer indipendenti apportano modifiche, possono "timestamp" con un "orologio". Uso il termine "orologio" e "timestamp" ma non intendo un orologio da parete. Intendo una sorta di ordinamento parziale degli eventi che chiarisce la causalità. È la relazione "accaduta prima" tra gli eventi che forma un grafico aciclico diretto (DAG).
Sembra che il "solito" modo per fare questo ordinamento parziale sia usare un orologio vettoriale . Questi possono diventare molto grandi, tuttavia. Gli sviluppi più recenti come gli orologi ad albero ad intervalli forniscono una memorizzazione più compatta dei timestamp.
Ciò di cui non sono affatto chiaro è perché i protocolli di sincronizzazione apparentemente non "memorizzano" il DAG in modo esplicito. (O lo fanno?)
I peer possono creare indipendentemente un timestamp generando casualmente un UUID (o con altri mezzi, come <peer-name> + <local-monotonically-increasing-counter>
). L'ordinamento di questo timestamp è del tutto chiaro per quel peer.
Quando 2 peer si sincronizzano tra loro, possono concordare un nuovo timestamp. Ancora una volta, l'ordine di questo timestamp è chiaro per entrambi i peer.
Ora è necessario passare tra i peer l'accaduto prima del DAG, ma i requisiti di archiviazione e larghezza di banda di questo sono piccoli. I punti temporali sono vertici grafici. Come tali hanno 1 o 2 fronti in entrata (1 per un evento su un client e 2 per una sincronizzazione tra client). Questo è limitato e indipendente dal numero di peer nella rete.
Per utilizzare un singolo punto temporale, è necessario il grafico dei punti temporali che conducono a questo. Tuttavia, per quanto posso vedere, ogni peer che è in grado di conoscere di un punto temporale (che ha generato esso stesso, o generate con un altro peer, o è stato detto che da un altro peer durante la sincronizzazione con esso) ha anche avuto un'opportunità per conoscere la storia che porta a quel momento. Penso che ci sia probabilmente una prova induttiva per questo.
Dato che archiviare e sincronizzare il DAG sembra esplicitamente semplice: viene utilizzato nella pratica? In caso contrario, perché sono preferiti gli orologi vettoriali?
Appunti
Peer to peer
Preferirei una soluzione peer to peer su una soluzione server client.
La probabile topologia finale saranno molti client che si connettono a un gruppo molto più piccolo di server che si replicano tra loro. Tuttavia, sarebbe bello avere una soluzione generale che supportasse questa particolare topologia piuttosto che una soluzione che richiede questa specifica topologia.