Допустимо ли использовать Mono ‹Object› .publishOn (Schedulers.elastic) для блокировки операций?

Я понимаю, что при использовании операций блокировки в реактивных потоках мы должны использовать Publisher<Object>.publishOn(Schedulers.elastic).subscribe(//blocking operations go here)

Я понимаю, что это имеет смысл, когда мой издатель публикует список элементов (например, Flux), будущие элементы не должны ждать, пока текущий элемент будет заблокирован операцией блокировки. Но в случае Mono это необходимо? Потому что в моей трубе будет течь только один предмет.

PS. Я использую контроллер реактивного потока Spring Boot 2 примерно так.

@RestController("/item")
public Mono<Response> saveItem(Mono<Item> item) {
  return
  item.publishOn(Schedulers.elastic()) **//Do I need this ?**
      .map(blockingDB.save(item))
      .map(item -> new Response(Item);

}

person shanmugaprabhu    schedule 07.11.2017    source источник
comment
Возможно, вас заинтересует stackoverflow.com/questions/46918303/   -  person Jens Schauder    schedule 07.11.2017


Ответы (1)


Да, конечно!

Если вы этого не сделаете, вы заблокируете основные потоки обработки / цикла событий. Из них у вас должно быть ровно столько, сколько у вашей машины (эффективных) процессоров.

Скажем, это 8. Это означает, что всего 8 одновременных запросов, ожидающих операции блокировки, вы полностью остановите свое приложение!

Кроме того, не забудьте переместить обработку после операции блокировки обратно в пул потоков, предназначенный для интенсивной работы ЦП.

person Jens Schauder    schedule 07.11.2017