Comprendo che i comandi non dovrebbero restituire nulla.
Questa è una visione, ma non è interamente incastonata nella pietra. Considera le scritture (PUT, POST, DELETE) in HTTP: tutti questi messaggi sono comandi, nel senso che sono messaggi con la richiesta che lo stato della risorsa cambi, e tuttavia tutti restituiscono risposte.
Quindi, come gestite un errore oltre Command Bus? (Ad esempio, un utente si è registrato 1 secondo prima con lo stesso nome utente / e-mail).
Come si fa a sapere che il comando non è riuscito e come si conosce l'errore?
Quindi, nel caso in cui si stia comunicando direttamente con il gestore dei comandi, un messaggio restituito è un modo perfettamente ragionevole per riconoscere che il comando è stato ricevuto ed elaborato.
Se stai usando un middleware, come un bus, che ti impedisce di comunicare direttamente con la destinazione, ti suggerirei di guardare a schemi di messaggistica asincroni: come si fa a far sì che il gestore dei comandi rispedisca un messaggio al chiamante?
Un'idea è quella di iscriversi all'esito del comando; questo prende in prestito alcune delle idee nei modelli di integrazione aziendale di Hohpe. L'idea di base è che, poiché il client ha familiarità con il messaggio di comando che è stato inviato, è ben posizionato per iscriversi a tutti i nuovi messaggi pubblicati come conseguenza del messaggio di comando. Il gestore dei comandi, dopo aver salvato i dati nel registro, pubblica gli eventi annunciando che la modifica ha avuto esito positivo e il client si iscrive a tali eventi, riconoscendo gli eventi corretti considerando la coincidenza di vari identificatori nel messaggio (ID causalità, ID di correlazione e così via).
Approcci alternativi sono un po 'più diretti. Uno sarebbe quello di includere nel messaggio un callback, che può essere invocato dal gestore dei 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 " futuro realizzabile". Il messaggio indica al gestore comandi dove scrivere il riconoscimento; così facendo segnala al client (blocco del conto alla rovescia) che il riconoscimento è disponibile.
E, naturalmente, hai la possibilità aggiuntiva di rimuovere il middleware che sembra ostacolare semplicemente la cosa giusta.
Ad esempio, un utente si è registrato 1 secondo prima con lo stesso nome utente / e-mail
Se gestisci la registrazione dell'utente in modo idempotente, non sarebbe necessariamente un errore: ripetere i messaggi fino a quando non viene osservata una risposta è un modo comune per garantire almeno una volta la consegna.