Я понимаю, что Команды не должны ничего возвращать.
Это одна точка зрения, но она не совсем в камне. Рассмотрим записи (PUT, POST, DELETE) в HTTP - все эти сообщения являются командами в том смысле, что они являются сообщениями с запросом на изменение состояния ресурса, и все же они все возвращают ответы.
Итак, как вы справляетесь с ошибкой за пределами командной шины? (Например, пользователь зарегистрировался за 1 секунду до того же имени / адреса электронной почты).
Откуда вы знаете, что команда завершилась неудачно, и как вы узнали об ошибке?
Таким образом, в случае, когда вы общаетесь напрямую с обработчиком команд, возвращаемое сообщение является вполне разумным способом подтвердить, что команда была получена и обработана.
Если вы используете часть промежуточного программного обеспечения, например, шину, которая не позволяет вам напрямую взаимодействовать с целью, то я бы посоветовал вам обратиться к шаблонам асинхронного обмена сообщениями - как заставить обработчик команд отправлять сообщение обратно вызывающий?
Одна идея состоит в том, чтобы подписаться на результат команды; это заимствовано из некоторых идей в паттернах корпоративной интеграции Hohpe. Основная идея заключается в том, что, поскольку клиент знаком с отправленным командным сообщением, он имеет все возможности для подписки на любые новые сообщения, опубликованные как следствие командного сообщения. Обработчик команд, после сохранения данных в книге записей, публикует события, объявляющие об успешном изменении, и клиент подписывается на эти события - распознавая правильные события, учитывая совпадение различных идентификаторов в сообщении (идентификатор причины, идентификатор корреляции и т. д.).
Альтернативные подходы немного более прямые. Можно было бы включить в сообщение обратный вызов, который может быть вызван обработчиком команды после успешной обработки сообщения.
Очень похожая альтернатива - зарезервировать место в командном сообщении для обработчика команды, чтобы написать подтверждение - поскольку клиент уже имеет рассматриваемое командное сообщение, схема уже завершена. Подумайте « обещание » или « выполнимое будущее». Сообщение сообщает обработчику команды, где написать подтверждение; это сигнализирует клиенту (защелка обратного отсчета), что подтверждение доступно.
И, конечно, у вас есть дополнительная опция удаления промежуточного программного обеспечения, которое, кажется, мешает просто делать правильные вещи.
Например, пользователь зарегистрировался за 1 секунду до того же имени пользователя / адреса электронной почты
Если вы идемпотентно обрабатываете регистрацию пользователей, это не обязательно будет ошибкой - повторение сообщений до тех пор, пока не будет получен ответ, является обычным способом обеспечить хотя бы один раз доставку.