2016-05-25 3 views
1

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

Например:

Запрос X состоит из 4 вызовов на нескольких микро-услуг, но микро сервис число 3 занимает больше времени, чем ожидалось, и весь запрос достигает тайм-аут (например, 30 секунд). Я думаю, в этом случае пользователь получит ошибку тайм-аута. Но как мы отменим этот запрос, который уже в полете? Я имею в виду, скажем, через 40 секунд микросервис номер 3 отвечает, и поток продолжается ... пользователь уже получил бы к нему ошибку.

Благодаря

ответ

0

Я пытаюсь получить мою голову вокруг микро-службы обмена сообщениями вместо чистого REST

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

Это может быть и правда. Например, вы могли бы определить такую ​​операцию, как:

HTTP 1.1 /api/Thingys/1234 GET 

, который был бы эквивалентен

channel.Send(new GetThingyQuery{ ThingyId=1234; }); 
void HandleResponse(Thingy thingy); 

как обмен сообщениями, из одной службы в другую.

Однако есть еще один способ подумать об этом. В приведенном выше примере предположим, что для обслуживания требуется A Thingy из службы B. Есть два способа, которыми мы можем реализовать это:

  1. служба звонит по GetMyThingy() операцию на обслуживание B.
  2. Сервис А не называют GetMyThingy, потому что служба уже имеет копию Thingy ,

Итак, как у службы A уже есть Thingy?

Служба B уже отправила ее в Службу A в форме Event. Фактически, службе B не нужно было фактически отправлять thingy явно для обслуживания A. Service B даже не нужно было знать об услуге A, потому что служба B published the thingy.

Так что в этом случае операция переходит от службы B для обслуживания и становится:

void HandleThingyEvent(ThingyEvent event); 

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

... как отменить запрос.

Это подводит нас к тому, как мы можем ответить на ваш главный вопрос, который, как мы теперь можем видеть, это «Удалить необходимость запроса полностью». Мы делаем это, используя события и публикации, которые, хотя они могут быть реализованы синхронно, намного лучше подходят для односторонней передачи сообщений.