Conversione efficiente dei dati in Event Sourcing

1

Stiamo utilizzando un concetto simile a Event Sourcing per archiviare i dati / le azioni di un sistema collaborativo in esecuzione .

Il sistema ha alcuni utenti 2-3k che lo usano ogni giorno e sta crescendo.

Col passare del tempo, il codebase si evolve e i dati che abbiamo già memorizzato devono essere aggiornati per adattarsi ai nuovi formati. Questo è uno scenario raro, ma succede e credo che sia molto più "sano" convertire i dati passati per conformarsi alla nuova base di codice, piuttosto che gestire i precedenti formati all'interno del codebase, in modo da sporcarlo con il passare del tempo.

Ho scritto un piccolo strumento che scarica blocchi di eventi (~ 3000 eventi) per ciclo, map() s su di essi, convertendoli e ripristinandoli in batch. È abbastanza efficiente.

Tuttavia, mi ci è voluto quasi un giorno per convertire 7 mesi di dati (~ 30 GB). Dopo circa un anno, questo potrebbe iniziare a richiedere 2 giorni per terminare e dopo 2 anni questo potrebbe iniziare a richiedere settimane.

Esistono strategie migliori quando gestiscono tali conversioni di dati?

    
posta Nik Kyriakides 21.02.2018 - 10:06
fonte

2 risposte

1

Per la gestione di un tale sistema nel corso degli anni, è necessario cercare strategie globali che funzionino a lungo termine, non per alcune ottimizzazioni locali. Ma la prima cosa che dovresti chiederti qui è:

Ho davvero bisogno di un'ottimizzazione adesso ?

Considera che tra due o più anni possono accadere molte cose. Forse l'hardware o il software DB sottostante diventa più veloce, il che potrebbe risolvere automaticamente il tuo problema. Oppure puoi scalare usando più server, dal momento che noleggiarli costa meno. O il tuo sistema svanirà dal mercato, dal momento che gli utenti cambiano in qualche concorrente. O hai cambiato l'intera architettura sottostante in una versione più recente del sistema, quindi le soluzioni che hai risolto ora non saranno più applicabili.

Fai attenzione a non investire troppi sforzi per cose che potrebbero non essere mai applicabili.

Ma supponiamo per un attimo che il tuo sistema sia online per i prossimi 10 anni e cresca costantemente nel tempo. Mi concentrerei su due cose qui:

  • archivia i dati più vecchi quando non vengono più utilizzati (quindi puoi rimuoverli dal database live)

  • evitare la frequente conversione dei dati implementando una flessibilità sufficiente nel sistema in grado di gestire le modifiche dei requisiti più frequenti senza modifiche allo schema del database o modifiche ai database compatibili con le versioni precedenti.

Se, in alcuni anni, arrivi davvero al punto in cui devi convertire un Terabyte di dati in un nuovo modello di dati, puoi implementare alcune strategie in cui

  • migrare tutti gli eventi esistenti alla data "x" dal sistema live al nuovo modello di dati (diciamo che ci vuole una settimana)

  • quindi migrare gli eventi da "date x" a "date x + 7" dal sistema live

  • quindi cambia sistema per alcuni minuti, esegui la migrazione degli eventi rimanenti e

  • passa infine al nuovo modello di dati.

Tuttavia, se fossi nei tuoi panni, non lo implementerei prima che risultasse necessario.

    
risposta data 21.02.2018 - 11:44
fonte
1

La tattica / ottimizzazione che è possibile utilizzare per aggiornare un evento a un altro evento nell'archivio eventi è questa:

  • copia l'intera tabella degli eventi in una tabella temporanea ( CREATE TABLE NewEventStore LIKE EventStore - per conservare gli indici)
  • seleziona i tipi di eventi che sono stati modificati utilizzando WHERE eventName IN ('event-type1', 'event-type2') ; dovresti avere un indice su eventName per selezionare rapidamente
  • modifica / sostituisce ciascun evento selezionato con la nuova versione;
  • ferma le scritture e le leggi in EventStore
  • scambia la vecchia tabella con la nuova tabella ( DROP TABLE EventStore; RENAME TABLE NewEventStore to EventStore )
  • riabilita le scritture e le letture su EventStore

Se vuoi mantenere attivo il sistema durante lo scambio, le cose si complicano in quanto è necessario sincronizzarsi in qualche modo con il sistema di scrittura.

    
risposta data 21.02.2018 - 11:23
fonte

Leggi altre domande sui tag