Attualmente sto affrontando un problema con un'applicazione che ha funzionalità di deposito / prelievo.
Il database sottostante (Cassandra) non offre blocchi di lettura / scrittura.
Ora supponiamo che l'utente A abbia depositato 100 $ nel suo account, Egli può usare questo credito per inviare 100 e-mail.
Immagina il seguente scenario:
-
L'utente A apre due diverse schede, t1 e t2, e indica loro la pagina per l'invio di e-mail.
-
Riempie i campi di entrambe le schede per inviare 100 e-mail e hit inviati quasi alla stessa ora.
Ora ciò accade in background.
Ora 0: t1 controlla se l'utente ha credito sufficiente per l'invio di 100 e-mail? Vero. Lo fa.
Ora 0.01: t2 verifica se l'utente ha credito sufficiente per l'invio di 100 e-mail? Vero. Lui fa. (t1 non ha aggiornato il valore del credito dell'utente).
Ora 0.02: t1 aggiorna il credito a 0 e passa all'invio di 100 e-mail.
Ora 0.03: t2 aggiorna il credito a 0 e passa all'invio di 100 e-mail.
L'utente malintenzionato ha ora inviato 200 e-mail mentre aveva crediti sufficienti per inviare solo 100.
Un approccio sarebbe quello di fare un'azione sottrazione invece di aggiornare , in tal caso t2 imposterà il campo di credito dell'utente a -100, ma l'utente ha già overspent il suo credito.
Quindi, ecco le mie domande:
- Qual è il nome accademico o più tecnico di questo problema? Condizione di gara? Sincronizzazione del problema?
- Quali sono alcuni approcci per impedire che ciò accada? Ciò potrebbe accadere ovunque venga distribuito il database, come gli inventari dei prodotti Amazon o Visa Card.
Come gestiscono questa situazione nei momenti di picco in cui due clienti possono acquistare un articolo nello stesso momento in cui non effettuano la sovrastampa? o nel caso di Visa, in che modo impediscono a qualcuno di prelevare più del saldo dell'account copiando la sua carta fisica e utilizzandola su due bancomat molto distanti? (aumentando così la probabilità che colpirà due diversi nodi del database che non sono sincronizzati in tempo reale a causa della distanza geografica.)
Sono molto confuso su questo,
Qualsiasi aiuto è molto apprezzato.