Модель потоков в Spring WebFlux и Reactor
Проблема с моделью параллелизма и потоков в WebFlux и Reactor
Я сейчас экспериментирую с реактивным программированием, используя Spring 5.0.0.RC2, Reactor 3.1.0.M2 и Spring Boot 2.0.0.M2.
Меня интересует модель параллелизма и потоков, используемая WebFlux и Reactor, чтобы правильно реализовать приложение и управлять изменяемым состоянием.
В документации по Reactor указано, что библиотека считается независимой от параллелизма и упоминается абстракция Scheduler. Однако документация WebFlux не содержит информации на этот счет.
Тем не менее, при использовании WebFlux через Spring Boot определенная модель потоков все же выставляется.
Вот что я выяснил в ходе своих экспериментов:
- Модель не является ни "1 поток события", ни "1 поток события + работники"
- Используются несколько пулов потоков
- Потоки "reactor-http-nio-3": вероятно, по одному на ядро, обрабатывают входящие HTTP-запросы
- Потоки "Thread-7": используются асинхронными запросами к MongoDB или HTTP-ресурсам
- Потоки "parallel-1": по одному на ядро, создаются функцией Schedulers.parallel() из Reactor, используются операторами задержки и подобными
- Разделяемое изменяемое состояние должно синхронизироваться приложением
- ThreadLocal (для состояния приложения, логирования MDC и т. д.) не имеют области запроса, поэтому не представляют большого интереса
Правильно ли это? Какова модель параллелизма и потоков в WebFlux: например, какие использованы пула потоков по умолчанию?
Спасибо за информацию!
Что значит 'synchronized'?
Разница между интерфейсами Runnable и Callable в Java
Как распределяются потоки для обработки запросов Servlet?
Следует ли использовать отдельные экземпляры ScriptEngine и CompiledScript для каждого потока?
SwingUtilities.invokeLater: Вызов кода в потоке событий Swing