Comments 11
Стоимость потоков в Java
В java 21 появились виртуальные потоки и все описанное тут становится не совсем актуально. Как и использование реактивщины только для того, чтобы получить неблокирующее API.
а в чем потеря актуальности ?
если (когда) реактивный подход станет использовать виртуальные потоки, то, как мне это видится, получит дополнительные преференции в качестве увеличения производительности и сокращения потребления памяти на выделение потоков, я конечно, могу ошибаться в своих предположениях
а в чем потеря актуальности ?
Я писал конкретно про раздел "Стоимость потоков в Java". Там написано вот такое, например:
Количество потоков ограничивается возможностями системы, поскольку потоки Java соответствуют системным потокам
Вот это уже не совсем так. Остальное тоже. Виртуальные потоки стали легковесными и все идет к тому, что они будут использоваться все чаще.
как мне это видится, получит дополнительные преференции в качестве увеличения производительности
Думаю, что чего-то сильно полезного не получит. Это две технологии примерно про одно и то же. Просто Project Reactor появился раньше, и был реализован на более высоком уровне, ну и с back pressure и реактивными манифестами. А чуть позже похожее реализовали средствами JVM. И то и другое, если не ошибаюсь, использует ForkJoinPool под капотом
Количество потоков ограничивается возможностями системы, поскольку потоки Java соответствуют системным потокам
Вот это уже не совсем так. Остальное тоже. Виртуальные потоки стали легковесными и все идет к тому, что они будут использоваться все чаще.
что значит не так, разве что-то поменялось в том, что ОС накладывает ограничения по потокам ? вроде все так как и прежде, или мы что-то пропустили ?
Виртуальный поток больше не соответствует потоку ОС. Соответственно, никаких ограничений нет со стороны ОС. Виртуальных потоков можно создать миллион, в отличие от реальных
это да, но каким образом, возможность увеличивать количество потоков может принципиально повлиять на отказ от реактивного подхода в разработке ?
Вы пишете что при использовании webClient нужно переключить поток на другого издателя - как это сделать?
Для этого стоит использовать .publishOn()
Но тогда следующий элемент не будет взят в обработку? Как-то можно переключить поток на main?
Таким образом, операторы следующие дальше по цепочке будут выполнять свой код в выбранном потоке планировщика, и следующий элемент не будет взят в обработку, пока текущий элемент не будет обработан всеми нижеследующими операторами, либо не переключится поток
Вот здесь вы это пишете.
поэтому надо быть крайне внимательным и стараться переключать поток сразу после выполнения webClient запросов
а можно более развернутый пример как стоит делать, пожалуйста.
Когда переключаются потоки в Spring WebFlux