WebFlux и Kotlin Corountines без ReactiveCrudRepository - PullRequest
0 голосов
/ 18 мая 2018

Я работаю над проектом, который использует Kotlin, Spring Boot, Hibernate (все в последней версии), и я хотел бы сделать его реактивным с помощью среды WebFlux из Spring.

Проблема в том, что я могуне используйте ReactiveCrudRepository, потому что веб-приложение должно использовать базу данных Oracle и, следовательно, Hibernate.Поэтому я не мог найти способ, как использовать неблокирующий доступ к базе данных Oracle SQL (только бесплатные платформы).

Мой вопрос:

Можно ли использовать это так:

  • Случайный CrudRepository, который блокирует
  • Служба, которая использует corountines и возвращает все как Mono

Пример кода службы:

fun getAllLanguages(): Mono<Collection<ProgrammingLanguage>> = async { repository.findAll() }.asMono()

После этого будет контроллер с:

fun listProgrammingLanguagesReactive() = mono(Unconfined) {
    service.also { logger.info { "requesting list of programming languages" } }
            .getAllLanguages()
            .also { logger.info { "responding with list of programming languages" } }
}

Этот подход работает, но я не уверен, будет ли он работать постоянно и не является ли это ужасной практикой и т. Д.

1 Ответ

0 голосов
/ 27 мая 2018

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

Ваш подход так же хорош, как и любой другой, для предоставления асинхронного адаптера для блокировки API.

Однако учтите следующее:

Возможно, вы захотите ограничить async { repository.findAll() } и аналогичные блокирующие вызовы выделенным фиксированным ThreadPool / Dispatcher.Хотя сопрограммы дешевы, помните, что repository.findAll() блокирует реальный базовый поток, и вы не хотите исчерпывать все потоки в CommonPool (который используется async по умолчанию).

Этополезная практика, так как вы ограничиваете количество потоков / одновременных блокировок вызовов.Если ваш фиксированный пул в какой-то момент исчерпан, то входящие запросы будут обрабатываться suspend без блокирования потоков, пока в пуле не появятся доступные потоки для их обработки.

...