Я пытаюсь получить мою голову вокруг микро-службы обмена сообщениями вместо чистого REST
Одним из ключевых недоразумениям при рассмотрении различий между вызовом услуги через синхронные и асинхронные означает, что характер вызовов непосредственно передается и эквивалентен друг другу.
Это может быть и правда. Например, вы могли бы определить такую операцию, как:
HTTP 1.1 /api/Thingys/1234 GET
, который был бы эквивалентен
channel.Send(new GetThingyQuery{ ThingyId=1234; });
void HandleResponse(Thingy thingy);
как обмен сообщениями, из одной службы в другую.
Однако есть еще один способ подумать об этом. В приведенном выше примере предположим, что для обслуживания требуется A Thingy из службы B. Есть два способа, которыми мы можем реализовать это:
- служба звонит по GetMyThingy() операцию на обслуживание B.
- Сервис А не называют GetMyThingy, потому что служба уже имеет копию Thingy ,
Итак, как у службы A уже есть Thingy?
Служба B уже отправила ее в Службу A в форме Event. Фактически, службе B не нужно было фактически отправлять thingy явно для обслуживания A. Service B даже не нужно было знать об услуге A, потому что служба B published the thingy.
Так что в этом случае операция переходит от службы B для обслуживания и становится:
void HandleThingyEvent(ThingyEvent event);
Так что вызвало событие, которые будут опубликованы службы B? Ну, это может быть так просто, как добавление новой вещи или обновление существующей вещи.
... как отменить запрос.
Это подводит нас к тому, как мы можем ответить на ваш главный вопрос, который, как мы теперь можем видеть, это «Удалить необходимость запроса полностью». Мы делаем это, используя события и публикации, которые, хотя они могут быть реализованы синхронно, намного лучше подходят для односторонней передачи сообщений.