Я использую Project Reactor
для нового сервиса, который пишу.Я использую Spring 5
с Netty
.Я взаимодействую с кучей разных сервисов и реляционной базой данных.У всех этих служб есть клиент, который блокирует, и JDBC
также блокирует.Поэтому, по сути, ни один из этих сетевых вызовов не возвращает издателя.
Мой вопрос заключается в том, что должно быть наилучшей практикой при работе со всеми блокирующими API.В настоящее время все, что я сделал, обернуло весь код блокировки API в Mono.callable
и использовал subscribeOn(Scheduler.elastic())
.Таким образом, по существу вся работа по блокировке выполняется на пуле эластичных нитей.
Вопрос 1. Должен ли я создавать выделенного исполнителя пула потоков, а не использовать эластичный?Если да, то почему?Или я должен создать выделенный эластичный пул для каждого отдельного сервиса?
Вопрос 2. Когда метод блокировки возвращает результат, я должен использовать publishOn
, чтобы основной поток возобновил обработку снова?Если да, то как мне вернуть ссылку на основной поток (поток цикла событий netty?)?
Вопрос 3. Если я вызываю несколько блокирующих вызовов для нескольких разных операторов (некоторые во время цепочки, некоторые при использовании zip()
call), затем при использовании subscribe
publish
и снова subscribe
publish
не приведет к значительному переключению контекста?
Большинство этих вопросов связаны с тем, что должно быть наилучшей практикой.