Impedisci la gestione degli eventi duplicati

5

Qual è il modo migliore per impedire la gestione degli eventi più di una volta?

Immagina un sistema in cui i clienti possono effettuare ordini e, in caso di successo, viene generato un evento OrderCreated . Esistono alcuni processi separati che ascoltano gli eventi su un bus dei messaggi.

Una procedura consiste nell'inviare una e-mail al cliente, presupponendo che sia necessario inviare un'e-mail al cliente.

Immagino che il processo di invio delle email funzionerebbe nel modo seguente:

  1. Invia email
  2. Persist handled id
  3. Conferma il bus dei messaggi

Ma se persiste l'id gestito, il cliente riceve più email.

L'unica altra soluzione che ho pensato era di fare quanto segue:

  1. tenta di gestire l'ID evento
  2. Invia email
  3. Pers event ID gestito
  4. Conferma il bus dei messaggi

Questo mi permetterebbe di controllare se l'evento è stato tentato di essere gestito prima, e in tal caso sollevare qualche errore e chiedere a un umano se provare e inviare nuovamente.

Esistono modi migliori per gestire problemi come questi? Credo che questo genere di cose sarebbe un problema comune, ma non riesco a trovare una soluzione solida.

    
posta Nick Williams 18.12.2016 - 19:48
fonte

1 risposta

2

What is the best way of preventing of events from being handled more than once?

Il modo migliore: scrivi il tuo modello di dominio in modo tale che la gestione al massimo una volta sia incorporata nella logica aziendale.

Marc de Graauw, da Nessuno ha bisogno di messaggi affidabili :

Stating that it is important on the business level that every message is received exactly once, like it is in order processing, means that every message constitutes a unique business transaction.... if every message is a unique business transaction, clearly there must be a unique id on the business level.... if we need such a unique token on the business level, the business level should assert it's uniqueness. Uniqueness on the business level should not be dependent on the transient uniqueness on the message level, but must be a persistent feature of the business message, and business semantics must guarantee it.

Ma questo non è il tipo di esempio che stai considerando;

One process is to send an email to the customer, assume there is a requirement that the customer MUST be sent an email.

In una situazione in cui DEVE; Normalmente cercherò almeno una volta la gestione dell'evento. Il processo tiene traccia di entrambe le e-mail richieste e che sono state riconosciute.

Ad esempio, il processo che sottoscrive a OrderCreated , EmailSent e EmailTimedOut . Su "ordine creato", inviamo un comando per inviare l'email e un altro per pubblicare l'evento di timeout. Dopo aver ricevuto il timeout, controlliamo se è apparso il messaggio EmailSent; in caso contrario, rispediamo .

Are there any better ways to handle problems like these?

Rivedere in dettaglio il costo per il business delle diverse modalità di errore. Se DEVI inviare l'e-mail, allora hai bisogno di sapere che l'hai fatto. Se l'ack può perdersi, allora è necessario inviare nuovamente: qual è il costo per l'attività di invio di tale e-mail più di una volta? Non iscriversi alla perfezione costosa quando il guasto è raro e a basso costo.

I feel like this sort of thing would be a common problem but I can't find a robust solution.

Jonathon Oliver: Messaggi: almeno una volta la consegna

One of the primary reasons, if not the primary reason, that messaging systems offer at-least-once delivery rather than exactly-once delivery is that we run into limitations as expressed in the CAP theorem—all “nodes” cannot possibly have a globally consistent snapshot and be available and partition tolerant. There is no unfailing “global brain”.

Vedi anche: link

    
risposta data 19.12.2016 - 04:39
fonte

Leggi altre domande sui tag