Eu entendo que os comandos não devem retornar nada.
Essa é uma visão, mas não está totalmente imutável. Considere gravações (PUT, POST, DELETE) em HTTP - todas essas mensagens são comandos, no sentido de que são mensagens com solicitação de mudança de estado do recurso e, no entanto, todas elas retornam respostas.
Então, como você lida com um erro além do Command Bus? (Por exemplo, um usuário se registrou 1 segundo antes com o mesmo nome de usuário / email).
Como você sabe que o comando falhou e como você sabe o erro?
Portanto, em um caso em que você está se comunicando diretamente com o manipulador de comandos, uma mensagem retornada é uma maneira perfeitamente razoável de reconhecer que o comando foi recebido e processado.
Se você estiver usando um middleware, como um barramento, que o impede de se comunicar diretamente com o destino, sugiro que você procure padrões de mensagens assíncronos - como você faz com que o manipulador de comandos envie uma mensagem de volta ao chamador?
Uma idéia é assinar o resultado do comando; isso se baseia em algumas das idéias dos padrões de integração corporativa da Hohpe. A idéia básica é que, como o cliente está familiarizado com a mensagem de comando enviada, está bem posicionado para assinar quaisquer novas mensagens publicadas como conseqüência da mensagem de comando. O manipulador de comandos, depois de salvar os dados no livro de registro, publica eventos anunciando que a alteração foi bem-sucedida e o cliente se inscreve nesses eventos - reconhecendo os eventos corretos considerando a coincidência de vários identificadores na mensagem (ID de causa, ID de correlação e assim por diante).
Abordagens alternativas são um pouco mais diretas. Um seria incluir na mensagem um retorno de chamada, que pode ser chamado pelo manipulador de comandos depois que a mensagem for tratada com êxito.
Uma alternativa muito semelhante é reservar espaço na mensagem de comando para o manipulador de comandos escrever a confirmação - como o cliente já possui a mensagem de comando em questão, o circuito já está completo. Pense em " promessa " ou " futuro completável". A mensagem informa ao manipulador de comandos onde escrever a confirmação; isso sinaliza ao cliente (trava de contagem regressiva) que a confirmação está disponível.
E, claro, você tem a opção adicional de remover o middleware que parece estar atrapalhando a maneira correta de fazer a coisa certa.
Por exemplo, um usuário registrou 1 segundo antes com o mesmo nome de usuário / email
Se você estiver manipulando o registro do usuário de forma idônea, isso não seria necessariamente um erro - repetir mensagens até que uma resposta seja observada é uma maneira comum de garantir pelo menos uma vez a entrega.