Проектирование высоконагруженных реактивных систем с использованием Java и Spring Webflux: преимущества перед традиционным стеком
Автор: Ляшов Е.И.
Журнал: Международный журнал гуманитарных и естественных наук @intjournal
Рубрика: Технические науки
Статья в выпуске: 1-3 (100), 2025 года.
Бесплатный доступ
В данной статье рассмотрены основные понятия реактивного программирования, представлен сравнительный анализ производительности реактивного подхода с использованием Spring WebFlux и традиционного императивного подхода на базе Spring MVC для построения высоконагруженных веб-приложений. Исследование демонстрирует преимущества реактивного программирования в контексте обработки большого количества одновременных запросов и эффективного использования системных ресурсов.
Реактивное программирование, высокие нагрузки, масштабируемость, производительность
Короткий адрес: https://sciup.org/170208961
IDR: 170208961 | DOI: 10.24412/2500-1000-2025-1-3-180-185
Текст научной статьи Проектирование высоконагруженных реактивных систем с использованием Java и Spring Webflux: преимущества перед традиционным стеком
Современные корпоративные информационные системы с каждым годом предъявляют все более высокие требования к масштабируемости, отказоустойчивости и производительности серверных приложений. Быстрое развитие технологий и цифровизация бизнеса ставят перед разработчиками новые вызовы, требующие поиска более эффективных подходов к созданию программного обеспечения. Нагрузки на серверные приложения растут, пользователи ожидают мгновенного отклика, а предприятия стремятся минимизировать затраты на инфраструктуру.
Реактивное программирование представляет собой инновационный подход к обработке данных, основанный на асинхронных потоках и событийной архитектуре, позволяющий эффективно справляться с современными вызовами. Его основная идея заключается в том, чтобы приложения могли обрабатывать множество запросов одновременно, не блокируя основные потоки выполнения. Такой подход обеспечивает более рациональное использование ресурсов системы, что особенно важно для высоконагруженных сервисов и приложений, работающих в режиме реального времени.
В статье анализируются преимущества реактивного программирования для работы с большим количеством одновременных запросов, а также исследуются возможности его применения для оптимального использования системных ресурсов. Рассматриваются основ- ные принципы работы реактивных систем, их архитектура и отличия от традиционных подходов. Особое внимание уделяется сравнению производительности реактивных серверов и серверов с блокирующей моделью обработки запросов. Приведенные эксперименты и примеры демонстрируют, как использование реактивных фреймворков, таких как Spring WebFlux, позволяет значительно повысить масштабируемость и устойчивость приложений.
Материалы и методы
При использовании синхронного исполнения программного кода каждый следующий шаг выполняется только после завершения предыдущего. Например, при отправке долгих запросов к базе данных или внешним сервисам программа вынуждена ожидать ответа, прежде чем продолжить работу. Это приводит к блокировке основного потока, что значительно снижает скорость работы приложения. При увеличении нагрузки система может полностью перестать реагировать на пользовательские действия.
Асинхронный подход позволяет выполнять задачи без ожидания завершения предыдущих операций. Трудоемкие процессы, такие как обращение к API или взаимодействие с базой данных, обрабатываются в отдельных потоках. Основной поток остается свободным, что обеспечивает стабильную работу приложения и его быструю реакцию на пользовательские запросы.
В традиционных API для обработки параллельных запросов используется модель «один поток на запрос», где число потоков ограничено размером пула. Например, сервер Tomcat по умолчанию поддерживает до 200 подключений. Однако каждый поток потребляет определенный объем памяти, и при увеличении пула потоков возрастает нагрузка на ресурсы системы, что в конечном итоге приво- дит к снижению производительности. Это явно не является оптимальным решением.
Одним из распространенных способов решения проблемы является горизонтальное масштабирование – запуск дополнительных экземпляров приложения. Однако такой подход ведет к развертыванию лишних компонентов, которые не всегда используются. Кроме того, если приложение размещено в облаке, это увеличивает расходы.

Арр
Рис. 1. Традиционные REST API
Традиционные REST API (рис. 1) работают по блокирующему и синхронному принципу. Рассмотрим ситуацию: клиент отправляет HTTP-запрос на получение списка пользователей. После того как сервер получает этот запрос, ему выделяется поток сервлета для обработки. Этот поток выполняет необходимую логику и отправляет запрос к базе данных. Однако поток остается заблокированным до тех пор, пока база данных не вернет результат. С точки зрения масштабируемости это создает ограничения: одновременно можно обрабатывать до 200 запросов, а все последующие клиенты будут вынуждены ждать, пока какой-либо поток освободится.
Очевидно, этого недостаточно. А что, если бы потоки, обрабатывающие запросы, не ждали ответа от базы данных, а просто запрашивали уведомление о завершении операции? Тогда освободившийся поток мог бы сразу переключиться на новый запрос. Как только данные будут готовы, база данных инициирует обратный вызов, а свободный по- ток передаст ответ клиенту. Такой подход позволяет избежать блокировки потоков сервлета и значительно улучшить масштабируемость системы.
В реактивных API запрос клиента также получает поток из пула, который отправляет запрос к базе данных для извлечения данных. Однако, в отличие от классического подхода, поток не остается заблокированным в ожидании ответа. Вместо этого он делегирует задачу базе данных и сразу освобождается для обработки других запросов.
Когда база данных возвращает результат, его обработка происходит с использованием любого доступного потока из пула. Этот механизм позволяет приложению эффективно управлять операциями ввода-вывода, минимизируя блокировку потоков и обеспечивая возможность обрабатывать большое количество параллельных запросов даже с небольшим числом потоков. Таким образом, реактивное программирование реализует асинхронную и неблокирующую модель работы.

Рис. 2. Неблокирующая модель с использованием Event Loop
Этот подход известен как Event Loop. Когда поступает запрос, приложение выполняет базовую обработку и сразу делегирует операции ввода-вывода драйверу базы данных в виде события. Когда база данных будет готова вернуть данные, она инициирует событие, которое подхватывается любым свободным потоком из пула, чтобы отправить ответ клиенту. Такой метод позволяет более эффективно использовать ресурсы ЦП и обрабатывать значительно больше одновременных запросов.
Однако остаются некоторые нерешенные вопросы – например, размер ответа. Если объем запрашиваемых данных окажется слишком большим для обработки, это может вызвать сбой фронтенда.
Как же с этим справиться? И тут нам на помощь приходит реактивное программирование.
Реактивное программирование представляет собой подход к разработке, который базируется на обработке событий и потоков данных в асинхронном режиме. Системы, созданные на основе этой парадигмы, работают с данными в реальном времени и оперативно реагируют на изменения в состоянии приложения. Такой подход позволяет эффективно использовать ресурсы и минимизировать блокировки потоков, обеспечивая высокую производительность.
Spring WebFlux – это модуль фреймворка Spring, предназначенный для разработки реактивных веб-приложений на Java. Он предоставляет разработчикам удобные инструменты для создания потоков данных, выполнения асинхронных операций и взаимодействия с различными источниками данных.
Spring MVC (Model-View-Controller) – это традиционный модуль фреймворка Spring для создания веб-приложений. Он использует синхронную обработку запросов, где каждый запрос обрабатывается отдельным потоком. В отличие от Spring WebFlux, Spring MVC подходит для традиционных серверов с блокирующими операциями ввода-вывода, таких как Tomcat, и более эффективен при меньших нагрузках. Он основан на паттерне MVC, который разделяет логику приложения на модели, представления и контроллеры, что облегчает поддержку и тестирование кода.

Reactive Stack
Spring WebFlux is a non-blocking web framework built from the ground up to take advantage of multi-core, next-generation processors and handle massive numbers of concurrent connections.
Servlet Stack
Spring MVC is built on the Servlet API and uses a synchronous blocking I/O architecture with a one-request-per-thread model.
Netty, Servlet 3.1+ Containers
Reactive Streams Adapters
Spring Security Reactive
Spring WebFlux
Spring Data Reactive Repositories
Mongo, Cassandra, Redis, Couchbase, R2DBC
Servlet Containers
Servlet API
Spring Security
Spring MVC
Spring Data Repositories
JDBC,JPA, NoSQL
Рис. 3. Реактивный стек Spring WebFlux и традиционный подход Spring MVC
Преимущества реактивного подхода
Рациональное использование ресурсов. В традиционных серверах, использующих блокирующие операции ввода-вывода, каждому клиентскому запросу выделяется отдельный поток, что приводит к излишнему расходу памяти и нагрузки на процессор. В отличие от этого, реактивные приложения выполняют множество запросов в рамках одного потока благодаря неблокирующему вводу-выводу и асинхронной обработке.
Масштабируемость . Эффективное управление ресурсами позволяет реактивным системам легко адаптироваться к увеличению нагрузки. Они способны поддерживать большое количество активных соединений одновременно без значительного роста потребления памяти и процессорного времени.
Устойчивость к сбоям. Реактивные системы обладают встроенными механизмами обработки ошибок, что обеспечивает их отка- зоустойчивость. Ошибки изолируются, не влияя на работу других процессов, что позволяет системе продолжать функционировать даже при возникновении проблем.
Работа в режиме реального времени . Реактивный подход особенно эффективен в приложениях, где критически важно мгновенное реагирование на события и обновление данных. Это делает его идеальным выбором для чатов, игровых платформ и финансовых сервисов, где задержка в обработке может существенно повлиять на пользовательский опыт.
Для оценки эффективности реактивного подхода был проведен эксперимент, в котором сравнивалась производительность традиционного сервера на основе Spring MVC и реактивного сервера на основе Spring WebFlux при различных уровнях нагрузки. Результаты эксперимента представлены в таблице 1 и рисунке 4.
Таблица 1. Сравнение производительности
Нагрузка (запросов/сек) |
Spring MVC |
Spring WebFlux |
100 |
50 |
30 |
500 |
150 |
60 |
1000 |
300 |
90 |
2000 |
600 |
120 |

Рис. 4. Зависимость среднего времени отклика от уровня нагрузки
На рисунке 4 видно, что при увеличении нагрузки среднее время отклика у традиционного сервера растет значительно быстрее, чем у реактивного. Это подтверждает преимущество реактивного подхода в условиях высоких нагрузок.
Если для синхронного сервера используется Tomcat, то для асинхронного сервера применяется Netty. Рассмотрим, какие вычисли- тельные ресурсы требуются для обработки одного запроса в Netty и Tomcat:
Throughput (пропускная способность) – это общее количество обработанных данных. При низкой нагрузке, до 300 пользователей, показатели у RxNetty и Tomcat одинаковы, однако с увеличением нагрузки Netty значительно опережает Tomcat, почти в два раза.

Рис. 5. Сравнение производительности Netty и Tomcat
Заключение. Применение реактивного программирования и таких фреймворков, как Spring WebFlux, предоставляет разработчикам мощные инструменты для создания высокопроизводительных и масштабируемых систем. Этот подход значительно улучшает эффективность использования системных ресурсов, повышает устойчивость к сбоям и позволяет обрабатывать данные в реальном времени. Реактивные системы способны эффективно справляться с высокими нагрузками, минимизируя блокировки потоков и увеличивая пропускную способность. Эксперименталь- ному улучшению производительности по сравнению с традиционными методами разработки серверных приложений. Более того, реактивные системы предлагают гибкость и масштабируемость, необходимые для эффективной работы в условиях динамично меняющихся требований. Это делает реактивное программирование важным инструментом для разработки современных корпоративных приложений, которые должны справляться с большим количеством одновременных пользователей и обеспечивать высокую производительность при минимальных затратах на ные данные подтверждают, что использова- ресурсы.
ние реактивного подхода приводит к замет-
Список литературы Проектирование высоконагруженных реактивных систем с использованием Java и Spring Webflux: преимущества перед традиционным стеком
- Craig Walls. Spring in Action Sixth Edition. - Manning, 2022. - 520 p.
- Spring Framework, Spring Web MVC. - [Электронный ресурс]. - Режим доступа: https://docs.spring.io/spring-framework/reference/web/webmvc.html.
- Andrea Maglie. Reactive Java Programming. - 2016. - 125 p.
- Josh Long. Reactive Spring. - 2020. - 484 p.
- Reactive Streams Specification. - [Электронный ресурс]. - Режим доступа: https://www.reactive-streams.org.