Design del sistema: inserti transazionali a livello di applicazione

3

Ho un sistema che raggiunge un'API su base giornaliera e raccoglie dati. Questi dati sono suddivisi in gruppi logici, con un gruppo logico definito come tutti i dati appartenenti a un particolare utente. Un utente ha 30 account secondari e, per ciascun account, prendo l'API e inserisco i dati nel database. Dopo ogni colpo, eseguo un inserto quindi ho 30 colpi per questo ex.

Ora a volte l'API genera qualche errore temporaneo, ad esempio al punto 20, quindi se lo metto in try i dati di cattura per quel particolare hit vengono saltati, il che essenzialmente corrompe il database con dati non validi per quel particolare giorno.

Voglio inserire tutti i dati solo se tutti i successi hanno successo e non riesco a memorizzare il risultato per ogni hit in memoria in quanto richiederebbe troppa memoria in quanto ogni hit contiene molti dati.

Come dovrei progettare il sistema in modo che se si verifica un errore tra non viene inserito nulla?

Questo può essere ottenuto tramite transazioni a livello di DB, ma ho una restrizione che uso Elasticsearch e non riesco a trovare inserimenti transazionali in esso. In qualche modo ho bisogno di gestirlo a livello di applicazione.

    
posta anekix 05.03.2018 - 18:12
fonte

1 risposta

4

Utilizza una tabella temporanea.

O, invece di andare in giro con le tabelle temporanee reali, avere una tabella di staging.

inserisci le righe nella tabella di staging su un ID di lavoro che tieni in memoria.

Se tutto va bene, fai una singola transazione alla fine per copiare le righe nella tabella reale, quindi cancellale dalla tabella di staging.

Se qualcosa si rompe, hai influenzato solo la tabella di staging, quindi il tuo db va bene. È possibile cancellare i dati di staging se lo si desidera, ma poiché si utilizza un nuovo ID del lavoro ogni volta che non è urgente.

È possibile migliorare il processo generale mantenendo i dati di staging in giro e riottendo solo i bit falliti, a seconda dei dettagli del tuo caso.

    
risposta data 05.03.2018 - 18:20
fonte

Leggi altre domande sui tag