Entiendo que los comandos no deben devolver nada.
Esa es una vista, pero no está completamente en piedra. Considere las escrituras (PUT, POST, DELETE) en HTTP: todos estos mensajes son comandos, en el sentido de que son mensajes con solicitud de que el recurso cambie de estado y, sin embargo, todos devuelven respuestas.
Entonces, ¿cómo manejas un error más allá de Command Bus? (Por ejemplo, un usuario se registró 1 segundo antes con el mismo nombre de usuario / correo electrónico).
¿Cómo sabes que ese comando falló y cómo sabes el error?
Entonces, en un caso en el que se está comunicando directamente con el controlador de comandos, un mensaje devuelto es una forma perfectamente razonable de reconocer que el comando ha sido recibido y procesado.
Si está utilizando un software intermedio, como un bus, que le impide comunicarse directamente con el objetivo, le sugiero que busque patrones de mensajes asíncronos: ¿cómo hace que el controlador de comandos envíe un mensaje al ¿llamador?
Una idea es suscribirse al resultado del comando; Esto se basa en algunas de las ideas de los Patrones de integración empresarial de Hohpe. La idea básica es que, dado que el cliente está familiarizado con el mensaje de comando que se envió, está bien posicionado para suscribirse a cualquier mensaje nuevo publicado como consecuencia del mensaje de comando. El controlador de comandos, después de guardar los datos en el libro de registro, publica eventos anunciando que el cambio fue exitoso, y el cliente se suscribe a esos eventos, reconociendo los eventos correctos al considerar la coincidencia de varios identificadores en el mensaje (identificación de causalidad, ID de correlación , y así sucesivamente).
Los enfoques alternativos son un poco más directos. Una sería incluir en el mensaje una devolución de llamada, que puede ser invocada por el controlador de comandos después de que el mensaje se maneje con éxito.
Una alternativa muy similar es reservar espacio en el mensaje de comando para que el manejador de comandos escriba el acuse de recibo, ya que el cliente ya tiene el mensaje de comando en cuestión, el circuito ya está completo. Piense " promesa " o " futuro completable". El mensaje le dice al controlador del comando dónde escribir el acuse de recibo; Al hacerlo, se le indica al cliente (cierre de cuenta regresiva) que el reconocimiento está disponible.
Y, por supuesto, tiene la opción adicional de eliminar el middleware que parece estar impidiendo simplemente hacer lo correcto.
Por ejemplo, un usuario registrado 1 segundo antes con el mismo nombre de usuario / correo electrónico
Si está manejando el registro de usuario de manera idempotente, eso no sería necesariamente un error: repetir mensajes hasta que se observe una respuesta es una forma común de garantizar al menos una entrega.