Разница между картой и подпиской на Mono \ Flux? - PullRequest
0 голосов
/ 04 июля 2019

Правильно ли я предположить, что «map» может быть «подпиской» с типом возврата.Кажется, что они оба вызываются асинхронно, когда обещание будет выполнено?

Например, если я отправлю список из 3 асинхронных вызовов одновременно, будет ли применение операции map способом, описанным ниже, блокировать?

 Flux.merge(albums.stream().map(album -> {

        Mono<CoverResponse> responseMono  = clientRequestHandler.makeAsyncCall()

           //2.call and handler for async call
           return responseMono
                   .map(response -> processResponse());

       }).collect(Collectors.toList())).then(Mono.just(monoResponse));

В приведенном выше фрагменте каждая операция карты будет блокироваться?Если, скажем, первый вызов занимает 5 мс, чтобы вернуться, а каждый второй вызов занимает 2 мс, чтобы вернуться, будем ли мы ждать 3 мс + 2 мс + 2 м = 7 мс для операции enitre?или только 3 мс, поскольку после того, как первый вызов будет разрешен, вызовы 2 мс к тому времени уже разрешены.

1 Ответ

0 голосов
/ 04 июля 2019

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

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

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

Ваш responseMono.map не может быть запущен, пока в Mono<Response> responseMono действительно что-то не будет.Думайте об этом как о Promise, который будет сигнализировать приложению, когда оно будет разрешено.

Или вы можете думать о нем как о цепочке обратных вызовов.

Итак, в вашем примере вы делаетеclientRequestHandler.makeAsyncCall() но вы возвращаете Mono<CoverResponse> следующую часть, которую responseMono.map не сработает, пока в моно не будет CoverResponse.Таким образом, ваш «асинхронный» вызов, вероятно, является асинхронным, но все еще придерживается порядка следования списков, поскольку все в последовательном потоке.

Но map - это функция отображения.Он берет что-то из коробки, выполняет вычисления для чего-то в коробке, а затем возвращает новое значение или тип.

Что делает реактив лучше, чем другие опции, так это то, что когда вы делаете side effect удаленный вызовгде-то, что занимает время, поток, который обрабатывает это, не будет зависать и ждать окончания внешнего запроса, он начнет делать другие вещи, такие как обработка других запросов.

Затем, когда Mono<Response> подает сигнал системечто в ответе есть «что-то в коробке», тогда этот же поток или любой другой доступный поток продолжит обработку запроса.

...