Approccio asincrono
Tradizionalmente, un'API responsabile dell'esecuzione di un'attività asincrona come la creazione di una riga nel database deve fornire un mezzo per comunicare il successo o l'insuccesso. Puoi farlo in due modi:
- Tramite callback - che significa un'istanza di un'interfaccia che puoi chiamare in caso di successo o fallimento
- Tramite una promessa - che è un valore restituito immediatamente dopo la chiamata che blocca quando è necessario il valore (il processo viene eseguito in parallelo finché non è necessario il valore contenuto all'interno).
Il chiamante può quindi gestire la promessa o il richiamo di conseguenza. Se sono necessarie più chiamate, è necessario garantire che si è terminato prima di chiamare il successivo.
Approccio di coda
Questo approccio significa garantire più responsabilità al tuo back-end. Il chiamante non si preoccupa più se l'attività è terminata o meno. La tua api lo fa. Significa che devi garantire che le attività siano eseguite nell'ordine della loro chiamata. Questo può essere fatto abbastanza facilmente aggiungendo richieste in una coda. Le prime voci vengono elaborate per prime e solo una volta che ciascuna attività precedente è terminata.
Rapporti
Nei casi entrambi , devi prepararti alla possibilità che più thread accedano allo stesso record. In altre parole, potrebbe ancora succedere che il processo A cancelli la riga 1 per prepararsi a essere reinserito, e il processo B tenti di aggiornare la riga 1 poco dopo. Questo tipo di problema viene normalmente affrontato utilizzando le transazioni, ovvero, si dispone di una serie di azioni raccolte in una singola transazione. La tua API deve garantire che tutti saranno eseguiti o nessuno di essi sarà.
Questo può essere fatto ordinando le transazioni stesse . Con ogni chiamata all'API in una determinata transazione, tale transazione aumenta di 1 operazione. Non viene eseguito nulla fino a quando non viene dato l'ordine di eseguire la transazione e l'ordine di esecuzione corretto delle transazioni si basa sulla creazione di detta transazione. Questo per garantire che gli effetti delle transazioni future non vengano visti dal corrente.
Devi essere in grado di eseguire tutte le azioni di una transazione con un mezzo per invertire ogni operazione. Se l'errore si verifica a metà, è necessario invertire ogni processo riuscito fino a quel punto. Se la transazione ha esito positivo, gli effetti delle modifiche devono essere visibili nel database. Se stai utilizzando un singolo thread per applicare queste modifiche, non è necessario altro per rendere visibili le modifiche perché il tuo ordine di transazione lo garantisce. Tuttavia, se usi più thread per questo, dovrai assicurarti che qualsiasi altra transazione non possa vedere gli effetti della transazione in esecuzione fino alla fine.
Conclusione
I libri sono stati scritti su questo argomento, in quanto questo non è molto diverso da come funzionano i database e come vengono eseguite le richieste di modifica dei dati. Questo sfiora leggermente l'argomento, ma spero che ti dia abbastanza per lavorare.