Come dovrei gestire due crons che aggiornano il database?

1

Sto lavorando su un block explorer di Bitcoin-clone (specificamente Mincoin) che ha un timer di blocco di circa 1 minuto. Per coloro che non hanno familiarità con Bitcoin, in pratica una nuova struttura dati chiamata blocco viene propagata alla rete circa ogni minuto. Un blocco contiene molte informazioni, ma tre sono le più importanti:

  • Il blocco precedente prima di esso
  • Il prossimo blocco della catena
  • Una struttura dati contenente transazioni sulla rete

Quindi a volte in Bitcoin c'è una "riorganizzazione" che significa che la rete scopre che alcuni dei blocchi più recenti non sono validi e passa a un altro ramo di un minatore.

Al momento ogni 1 minuto ricevo tutti i nuovi blocchi dalla rete e li memorizzo nel mio database. Tuttavia, quando si verifica una riorganizzazione, non ero in grado di eliminare e ripetere la struttura a blocchi del mio database.

Ora che ho scritto questa funzionalità, sto riscontrando un nuovo problema. Ho una funzione che guarda negli ultimi 100 blocchi e controlla se l'hash del blocco è lo stesso di quello che riporta il mio client Mincoin. Se ci fosse una riorganizzazione, allora alcuni blocchi saranno diversi. Trovo il primo blocco che è diverso e cancello dal database il blocco precedente (in modo che il blocco possa puntare a quello nuovo corretto che verrà trovato), il blocco stesso e tutti i record di tutti i blocchi e le transazioni che avvengono dopo esso, quindi ricostruire da lì.

Il problema è che il processo di ricerca e cancellazione di ciascuna transazione all'interno dei blocchi eliminati richiede più di un minuto a causa della grande quantità di dati, anche se i campi che sto cercando sono indicizzati. Quindi sono preoccupato che il cron di 1 minuto che ho inserito nel programma causerà un problema nel punto in cui inizia a scrivere di nuovo dal database, mentre il processo di eliminazione dalla funzione di ricostruzione sta accadendo.

Sto usando PHP e PDO quindi ho una transazione PDO per la funzione di ricostruzione, ma questo aggiunge solo più confusione. Se la transazione PDO inizia a cancellare i record, durante questo processo un nuovo cron trova alcuni nuovi blocchi e li scrive nel database, quindi la transazione PDO termina, quali dati saranno memorizzati? Causerà un errore? Qual è il modo migliore per gestirlo? Dovrei scrivere qualche campo nel database che controlla il cron regolare (semplicemente mettere uno switch 0 o 1 per on e off) e mantenere lo switch disabilitato mentre la funzione di ricostruzione sta facendo la sua cosa?

Non sono sicuro di come strutturare il flusso di questo programma per garantire che non stia causando dati inaccurati nel mio database.

    
posta bvpx 19.09.2013 - 20:31
fonte

1 risposta

1

Ecco una possibile soluzione: invece di inserire i tuoi lavori direttamente nell'elenco cron, crea un meccanismo di accodamento che avvia i lavori in sequenza e non avvia un nuovo lavoro prima che il precedente non sia terminato. Il vantaggio è che non devi modificare nulla nel tuo database e non è necessario fornire alcun campo di blocco. Esistono diverse soluzioni per implementare tale coda, ad esempio, è possibile utilizzare cron per attivare la gestione delle code o per aggiungere lo stesso lavoro ogni minuto alla coda (mentre altri lavori vengono aggiunti solo una volta o in intervalli di tempo diversi).

    
risposta data 19.09.2013 - 21:41
fonte

Leggi altre domande sui tag