I understand that Commands should not return anything.
Questa è una visione, ma non è interamente scolpita nella pietra. Prendi in considerazione le scritture (PUT, POST, DELETE) in HTTP: tutti questi messaggi sono comandi, nel senso che sono messaggi con richiesta di modifica dello stato della risorsa e tuttavia restituiscono tutte le risposte.
So how do you handle an error beyond Command Bus? (For example, a user registered 1 second before with the same username/email).
How do you know that command failed, and how do you know the error?
Quindi, nel caso in cui comunichi direttamente con il gestore comandi, un messaggio restituito è un modo perfettamente ragionevole per riconoscere che il comando è stato ricevuto ed elaborato.
Se stai usando un pezzo di middleware, come un bus, che ti impedisce di comunicare direttamente con il target, allora ti suggerisco di guardare a schemi di messaggistica asincroni - come fai a mandare un messaggio al gestore di comandi torna al chiamante?
Un'idea è iscriversi al risultato del comando; questo prende a prestito alcune delle idee contenute negli Enterprise Integration Pattern di Hohpe. L'idea di base è che, poiché il client ha familiarità con il messaggio di comando inviato, è ben posizionato per sottoscrivere qualsiasi nuovo messaggio pubblicato come conseguenza del messaggio di comando. Il gestore di comandi, dopo aver salvato i dati nel registro, pubblica eventi che annunciano che il cambiamento ha avuto esito positivo e il cliente si iscrive a tali eventi, riconoscendo gli eventi corretti considerando la coincidenza di vari identificatori nel messaggio (ID di causalità, ID di correlazione e così via).
Gli approcci alternativi sono un po 'più diretti. Uno sarebbe quello di includere nel messaggio un callback, che può essere richiamato dal gestore comandi dopo che il messaggio è stato gestito con successo.
Un'alternativa molto simile è quella di riservare spazio nel messaggio di comando affinché il gestore comandi scriva il riconoscimento - poiché il client ha già il messaggio di comando in questione, il circuito è già completo. Pensa " promessa " o " completabile futuro". Il messaggio indica al gestore comandi dove scrivere il riconoscimento; facendo così segnali al client (conto alla rovescia) che il riconoscimento è disponibile.
E, naturalmente, hai l'opzione aggiuntiva di rimuovere il middleware che sembra stia ostacolando il modo di fare la cosa giusta semplicemente.
For example, a user registered 1 second before with the same username/email
Se gestisci la registrazione dell'utente in modo idonea, non sarebbe necessariamente un errore - i messaggi che si ripetono finché non viene osservata una risposta è un modo comune per garantire almeno una volta il recapito.