Обмен сообщениями между событиями служб и командами

Я пытаюсь понять различные методы, используемые при обмене сообщениями между службами.

Допустим, у меня есть сценарий, в котором мне нужна первая служба, чтобы уведомить другую о том, что пользователь запросил создание продукта, а вторая служба должна получить это сообщение, создать продукт, а затем ответить, сообщив первой службе, что продукт был созданный.

Я думаю, что команды вместе с запросом / ответом подходят для этого сценария, потому что первая служба должна будет адресовать другую конкретную службу и будет ждать обратной связи.

Я так понимаю:

События против команд:

События:

  • обеспечить слабую связь между сервисами.
  • выполните публикацию во все очереди, и службы, заинтересованные в таком сообщении, его заберут.

Команды:

  • выполнять отправку в определенную очередь, поэтому ее будут использовать только службы, которые получают с помощью этой очереди.

Запрос / ответ против публикации / подписки:

Запрос / ответ:

В запросе / ответе первый сервисный запрос от другого выполняет операцию и ждет, пока ответ не будет получен от более позднего.

Опубликовать / подписаться:

Первый сервис просто публикует сообщение и продолжает обработку, не дожидаясь обратной связи или ответа.

Теперь я начал проектировать систему обмена сообщениями, используя RabbitMQ вместе с Masstransit saga (Masstransit.Automatonymous), которая, похоже, следует за событиями с помощью методов публикации / подписки.

Мой вопрос:

могу ли я использовать команды с публикацией или события с запросом / ответом?

Я правильно понимаю? и можно ли саги использовать с запросом / ответом?


person Yahya Hussein    schedule 22.11.2017    source источник


Ответы (1)


В общем, ваше понимание правильное. Однако здесь я тоже резюмирую:

  • События используются в pub / sub. Сообщения публикуются, и их получают все подписчики. Издатель не знает, сколько подписчиков получит событие, если таковые имеются.
  • Команды отправляются на известный адрес. Это сообщение получит только один подписчик. Это используется, чтобы выстрелить и забыть.
  • Ответы также отправляются на конкретную конечную точку с дополнительными метаданными, такими как адрес ответа. Таким образом, потребитель может сделать то, что ему нужно, и отправить ответ. Это делается асинхронно, но отправитель ждет ответа.

Саги MassTransit с Automatonymous поддерживают любой тип обработки сообщений. Вам необходимо отобразить все сообщения, которые потребляет сага, как события конечного автомата, но это могут быть как команды, так и события - технически это не имеет значения. Саги могут публиковать и отправлять сообщения, а также могут отправлять запросы и ждать ответов.

Как вы спрашиваете о публикации команд и использовании событий для запроса-ответа. Технически, MassTransit не делает различий в типах сообщений. Все, что вы публикуете, - это событие. Отправляемый вами материал может быть командой или что-то еще, но это не событие. Когда вы используете запрос-ответ, вы должны отправить его на конкретную конечную точку, поэтому определенно это не событие.

person Alexey Zimarev    schedule 22.11.2017
comment
Спасибо за пояснение, сага потребляет как события конечного автомата, но это могут быть как команды, так и события, означает ли это, что то, что я определяю в саге как тип события, может быть событием или командой в зависимости от того, как я отправляю сообщение? - person Yahya Hussein; 22.11.2017
comment
Да, с точки зрения потребителя (а Saga - это всего лишь группа потребителей) нет никакой разницы между событиями и командами. Это просто сообщение. Разделение логично. - person Alexey Zimarev; 22.11.2017
comment
Понятно, еще раз спасибо. Вы встречали образец проекта с сагой и командами? - person Yahya Hussein; 22.11.2017
comment
Это образец, который у нас есть github.com/MassTransit/ Sample-ShoppingWeb / blob / master / src /, но, опять же, события - это просто сообщения. Сага не видит разницы. - person Alexey Zimarev; 22.11.2017
comment
публичное событие ‹CartItemAdded› ItemAdded {get; частный набор; } означает ли это, что при поднятии CartItemAdded itemAdded будет тоже? и как в этом образце применяется запрос / ответ? .. извините за слишком много вопросов - person Yahya Hussein; 22.11.2017
comment
Автоматическое событие отличается от сообщения. Строка, которую вы цитируете, связывает сообщение CartItemAdded с событием конечного автомата ItemAdded. - person Alexey Zimarev; 22.11.2017