È meglio effettuare chiamate di database o chiamate API esterne prima nel contesto di una singola richiesta Web?

3

Supponiamo che tu disponga di un'app Web che utilizza i dati sia da un database che da un'API esterna e che per determinate funzionalità, è necessario chiamare entrambi per poter leggere / scrivere i dati necessari.

È meglio:

A) Per prima cosa avviare una transazione DB e quindi effettuare tutte le chiamate necessarie al DB PRIMA di chiamare l'API, quindi eseguire il rollback della transazione se la chiamata API non riesce.

o

B) Effettua prima la chiamata API e poi chiama il DB in caso di successo.

Pro e contro di ciascuna opzione, così come le vedo:

Il grande Pro con A è che l'integrità dei dati rimane intatta, indipendentemente da eventuali errori. Se le chiamate al DB falliscono prima che io raggiunga l'API, quindi ritorno prima di effettuare la chiamata, e se la chiamata API fallisce, posso ripristinare la mia transazione DB. Se tutto ha successo, allora commetto la transazione DB e procedo alla mia maniera allegra.

Il grande Con con A è che, a causa della transazione, il DB verrà bloccato per un periodo di tempo incontrollabile durante la chiamata dell'API esterna, che potrebbe influire sulle prestazioni.

I pro e i contro di B sono essenzialmente l'opposto di Ps e C per A. Il Pro è che si evita un blocco DB durante la chiamata API. Il Con è che se la chiamata API ha esito positivo, ma le chiamate DB non riescono, è essenzialmente necessario ripristinare le modifiche apportate tramite l'API, che potrebbero essere o non essere possibili per un determinato contesto.

Sono parziale rispetto all'opzione A personalmente, poiché sono un grande sostenitore degli approcci "meglio prevenire che curare", ma cosa ne pensate?

    
posta EJay 28.04.2015 - 02:02
fonte

3 risposte

2

È molto più facile eseguire il rollback delle modifiche apportate in un database che si trova all'altra estremità di una chiamata API.

Ecco come lo farei io:

  • Avvia una transazione di database e apporta le modifiche lì.
  • Fai le chiamate API.
  • Se funzionano, commetti le modifiche al database; in caso contrario, ripristinare le modifiche.
risposta data 28.04.2015 - 13:19
fonte
1

Forse consideri una variante del commit a due fasi: fai prima e invia le tue modifiche al database, poi fai le tue chiamate API. Se le chiamate API non riescono, apportare modifiche compensative al database (in pratica, aggiornare il database con i valori precedenti). Ciò ha il merito di non bloccare il database per un periodo di tempo apprezzabile, ma offre un metodo per mantenere sincronizzate le modifiche tra DB e API.

    
risposta data 28.04.2015 - 16:06
fonte
0

Dalla tua affermazione "il DB sarà bloccato per un periodo di tempo incontrollabile durante la chiamata dell'API esterna, che potrebbe influire sulle prestazioni". Suppongo che la chiamata esterna potrebbe richiedere molto più tempo della chiamata DB.

Quindi se questo è il caso, allora farei la richiesta asincrona e invierò una risposta all'utente / UI che dice che la richiesta è stata inviata. Sul back-end, viene effettuata una chiamata asincrona all'API esterna e quando l'API ritorna e in base alla risposta è possibile effettuare la chiamata DB.

Se questa è un'applicazione di interfaccia utente, può aggiornare periodicamente i dati utilizzando una chiamata AJAX o se l'utente ha registrato un listener, può essere avvisato del completamento della richiesta.

    
risposta data 30.04.2015 - 23:47
fonte

Leggi altre domande sui tag