Требуется ли асинхронное программирование в Micronaut?

#java #asynchronous #reactive-programming #netty #micronaut

#java #асинхронный #реактивное программирование #netty #micronaut

Вопрос:

Существует некоторый компромисс с реактивным / асинхронным программированием — вы меняете более простой, более читаемый / поддерживаемый код для повышения производительности.

Если вы планируете выполнять операции блокировки в приложении Micronaut REST, считается ли ужасной практикой выполнять их в потоках, обслуживающих HTTP-запросы?

Если бы вы увеличили размер HTTP-запроса, обслуживающего пул потоков в Micronaut, чтобы он был похож по размеру на пул потоков обычной HTTP-платформы, например, нереактивный Spring MVC / Tomcat, ожидали бы вы, что характеристики производительности Micronaut будут аналогичны характеристикам Spring MVC, работающим на Tomcat?

Ответ №1:

Существует некоторый компромисс с реактивным / асинхронным программированием — вы меняете более простой, более читаемый / поддерживаемый код для повышения производительности.

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

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

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

При использовании с Netty Micronaut будет обслуживать ваши HTTP-запросы через неблокирующий цикл обработки событий, позволяя вашему приложению принимать (и масштабировать) запросы сверх того, что позволяет традиционный контейнер на основе сервлета (2.5 ~ событие 3.1 с Async запросами).

Однако при использовании такой модели следует учитывать множество проблем, и Micronaut снимает большую часть работы с ваших плеч, хорошо планируя использование ресурсов (CPU), что позволяет избежать блокировки запросов.

Один из распространенных и простых приемов заключается в использовании @ExecuteOn аннотации всякий раз, когда ваше приложение (или конечная точка ресурса) будет блокировать операции ввода-вывода (сеть, БД, диск …).