Разница между Reactor Flux и Java Fiber

Я читал о Java Fibers как о небольшой единице работы, которая будет отображаться на Threads. В случае блокирующего вызова другое волокно будет сопоставлено с тем же потоком. Поскольку потоки в Java являются потоками уровня ядра, это предотвратит исчерпание потоков.

Я использовал Spring Web-Flux, поэтому просто хотел понять, что происходит внутри, когда сервер Netty получает 100 запросов в секунду, каждый из которых включает доступ к реактивным базам данных. Как эти запросы сопоставляются с 40 потоками, которые сервер Netty порождает по умолчанию?

Чем флюс отличается от волокна? Как Flux гарантирует асинхронное поведение с ограниченным количеством потоков?


person Apurv    schedule 14.03.2020    source источник


Ответы (1)


Что происходит внутри, когда сервер Netty получает 100 запросов в секунду, каждый из которых включает доступ к реактивным базам данных. Как эти запросы сопоставляются с 40 потоками, которые сервер Netty порождает по умолчанию?

Вкратце, он берет эти запросы и назначает их в стиле «циклического перебора» каждому доступному базовому потоку (по мере того, как эти потоки становятся доступными). То же самое происходит и со всеми другими реактивными вызовами, конечно, с оговоркой, что в зависимости от конфигурации, они могут работать на других планировщиках и, следовательно, на других базовых пулах потоков с другим количеством потоков.

Чем флюс отличается от волокна?

Это очень большая тема, но обзор «высокого уровня» заключается в том, что поток (под которым я предполагаю, что вы подразумеваете «реактивную» Java, а не саму Flux) является асинхронной моделью, в которой ни один поток не может блокироваться, а волокна являются «зелеными». " потоки, предназначенные для синхронного использования, которые используют упреждающее планирование (среди других методов) для сопоставления с гораздо меньшим количеством базовых потоков уровня ядра.

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

Как Flux гарантирует асинхронное поведение с ограниченным количеством потоков?

Все очень просто, потому что он спроектирован как асинхронный. Вопрос здесь, похоже, основан на ложной предпосылке: асинхронное поведение не гарантируется или не гарантируется количеством доступных потоков, а вашей моделью (оно не может «перетекать» в синхронное поведение, если оно перегружено запросами. )

person Michael Berry    schedule 15.03.2020
comment
У Flux есть собственный Threadpool, верно? и у них есть собственное планирование. Использует ли Flux упреждающее планирование? Волокна используют неблокирующий ввод-вывод. Использует ли Flux то же самое? - person Apurv; 18.03.2020
comment
Я думаю, что вы путаете термины здесь - поток использует любой планировщик (и, следовательно, любой основной исполнитель), который вы ему назначаете. Эти планировщики обычно не содержали бы потоков, использующих вытесняющее планирование, - это не имело бы особого смысла, поскольку вы все равно не должны блокировать эти потоки (обычно это потоки уровня ядра). Реактивное программирование использует неблокирующий ввод-вывод (оно использует неблокирующее все, что и является его сутью), но волокна — это просто еще один тип потока, поэтому, используете ли вы их для выполнения блокирующего или неблокирующего ввода-вывода, полностью зависит от того, используете ли вы их для выполнения блокирующего или неблокирующего ввода-вывода. тебе. - person Michael Berry; 18.03.2020