Raggiungere l'atomicità tra due sistemi separati

0

Ho molti casi in cui ho bisogno di mantenere alcune informazioni in un database e completare un'azione secondaria usando un sistema di terze parti.

Ad esempio, ho un caso banale, per salvare le informazioni dell'utente e inviare una e-mail all'utente su questa azione. Come può essere un processo atomico, ad es. come posso essere sicuro che le informazioni dell'utente siano state salvate e che un'e-mail sia stata inviata con successo?

Se mantengo le informazioni, devo comunque inviare e-mail e non sono sicuro che si verificherà un errore sul server di posta.

Questo particolare ambiente di lavoro è IIS, asp.net mvc, server sql e server smtp.

    
posta John 25.05.2017 - 16:33
fonte

1 risposta

6

"Atomico" significa che il processo sembra essere avvenuto istantaneamente, o almeno non può essere interrotto. È possibile avere processi distribuiti atomici, ma non è facile, ad es. puoi fare quanto segue:

  • Avvia una transazione SQL
  • Aggiungi l'utente al database
  • Invia l'email
    • Rollback della transazione se l'e-mail non è riuscita a inviare
    • Conferma la transazione se l'email è stata inviata con successo

Tuttavia, anche questo non è infallibile, ad es. supponi che il tuo commit non vada a buon fine, o supponi di ricevere una risposta "email respinta" dopo 30 secondi dall'invio della tua email?

Invece, proverei a ottenere Consistency Event , ovvero a garantire che un'email venga inviata a un utente dopo l'utente viene salvato ma non necessariamente deve accadere immediatamente - è ok se l'email viene inviata qualche secondo (o anche pochi minuti) dopo che il record dell'utente è stato salvato, dopo tutto ci vorranno alcuni secondi per l'email da consegnare alla posta in arrivo degli utenti.

    
risposta data 25.05.2017 - 16:53
fonte