Как мне отправить ответ от моего обработчика событий на мой контроллер в микросервисной архитектуре с Rabbitmq? - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь начать с микросервисов, поэтому я работаю над игровым проектом, чтобы проверить это. Моя проблема сейчас заключается в регистрации пользователя. У меня есть контроллер в моем шлюзе Api, который принимает запрос и публикует событие на служебной шине (Rabbitmq).

Контроллер шлюза Api:

public async Task<ActionResult> RegisterUser([FromBody] CreateUser createUser)
        {
            await busClient.PublishAsync(createUser);
            return Accepted($"RegisterUser/{createUser.Email}");
        }

После этого я просто обрабатываю команду в моем приложении Identity CommandHandler:

public async Task HandleAsync(CreateUser command)
        {
            try
            {
                logger.LogInformation($"Creating user: {command.Name}.");

                var user = mapper.Map<UserRegister>(command);
                var userRegistered = await userService.RegisterAsync(user);

                if (userRegistered == null) await busClient.PublishAsync(new CreateUserRejected(command.Email,
                                                                         "The email is already in use", "400"));
                else
                    await busClient.PublishAsync(new UserCreated(userRegistered.Email, userRegistered.Name));

            }
            catch (CustomException ex)
            {
                await busClient.PublishAsync(new CreateUserRejected(command.Email, "Problem saving user.", ex.Code));
                logger.LogError(ex.Message);
            }
        } 

Если пользователь не существует, все работает отлично. Моя проблема в том, что когда пользователь уже существует, я хочу отправить событие обратно на свой шлюз Api в виде new CreateUserRejected(command.Email,"The email is already in use", "400"). Что мне теперь делать? Если я создаю EventHandler для управления событием, как я могу отправить обратно сообщение от EventHandler к контроллеру (чтобы его можно было отобразить моему конечному пользователю) ?. Моя первая идея заключалась в том, чтобы просто проверить локальное хранилище в моем шлюзе Api перед публикацией запроса на служебную шину, но тогда зачем вообще использовать события в случае отказа? Просто ищу лучший способ сделать это.

...