Реализация веб сервиса с применением парадигмы реактивного программирования Implementing a web service using the reactive programming paradigm
Путнин Валерий Игоревич,
X5RetailGroup
Putnin Valery Igorevich,
X5RetailGroup
Аннотация. Реактивное программирование — программирование с асинхронными потоками данных. Реактивный подход повышает уровень абстракции вашего кода и вы можете сконцентрироваться на взаимосвязи событий, которые определяют бизнес-логику, вместо того, чтобы постоянно поддерживать код с большим количеством деталей реализации. Код в реактивном программировании, вероятно, будет короче.
Преимущество более заметно в современных веб- и мобильных приложениях, которые работают с большим количеством разнообразных UI-событий. 10 лет назад всё взаимодействие с веб-страницей сводилось к отправке больших форм на сервер и выполнении простого рендеринга в клиентской части. Сейчас приложения более сложны: изменение одного поля может повлечь за собой автоматическое сохранение данных на сервере, информация о новом «лайке» должна отправиться другим подключенным пользователям и т.д.
Реактивное программирование подходит для обработки большого количества разнообразных событий.
В данной работе будет разработан веб сервис на языке Java c применением фреймворка Spring и реактивных потоков данных. Будет проведен анализ скорости работы сервиса где будут сравниваться реализация с применением парадигмы реактивного программирования и без нее. Так же будет описан процесс создания сервиса и технологии необходимые для полноценной работы приложения.
Summary. Reactive programming is programming with asynchronous data flows. The reactive approach increases the level of abstraction of your code and you can focus on the relationship of events that define the business logic, instead of constantly maintaining code with a lot of implementation details. Code in reactive programming is likely to be shorter.
The advantage is more noticeable in modern web and mobile applications that work with a large number of different UI events. 10 years ago, all interaction with a web page consisted of sending large forms to the server and performing simple rendering in the client part. Now applications are more complex: changing a single field may result in automatic data saving on the server, information about a new «like» should be sent to other connected users, etc.
Reactive programming is suitable for handling a large number of different events.
In this paper, we will develop a web service in Java using the Spring framework and reactive data flows. The service speed analysis will be conducted, where the implementation will be compared with the use of the reactive programming paradigm and without it. The process of creating the service and the technologies necessary for the full operation of the application will also be described.
Ключевые слова: Spring, Java, Реактивное программирование, веб-сервис, ООП, потоки данных, многопоточность.
Keywords: Spring, Java, Reactive programming, web service, OOP, data flows, multithreading.
Реактивное программирование — парадигма программирования, ориентированная на потоки данных и распространение изменений. Это означает, что должна существовать возможность легко выражать статические и динамические потоки данных, а также то, что нижележащая модель исполнения должна автоматически распространять изменения благодаря потоку данных.
К примеру, в императивном программировании присваивание a = b + c будет означать, что переменной a будет присвоен результат выполнения операции b + c, используя текущие (на момент вычисления) значения переменных. Позже значения переменных b и c могут быть изменены без какого-либо влияния на значение переменной a.
В реактивном же программировании значение a будет автоматически пересчитано, основываясь на новых значениях.
Современные табличные процессоры представляют собой пример реактивного программирования. Ячейки таблицы могут содержать строковые значения или формулу вида «=B1+C1», значение которой будет вычислено исходя из значений соответствующих ячеек. Когда значение одной из зависимых ячеек будет изменено, значение этой ячейки будет автоматически обновлено.
Другой пример — это языки описания аппаратуры (HDL), такие как Verilog. Реактивное программирование позволяет моделировать изменения в виде их распространения внутри модели.
Реактивное программирование предлагалось как путь для лёгкого создания пользовательских интерфейсов, анимации или моделирования систем, изменяющихся во времени.
К примеру, в MVC архитектуре с помощью реактивного программирования можно реализовать автоматическое отражение изменений из Model в View и наоборот из View в Model.
Особенность парадигмы объектно-ориентированного программирования заключается в особенности реализации главного контроллера серверного приложения. В обычной парадигмы сервер-контейнер приложения имеет ограничение на количество запросов за единицу времени, в случае с Tomcat — это 200 потоков одновременно, но в случае с реактивным программированием сервер-контейнер не используется, вместо этого применяется специальный контроллер в котором 1 поток, который при получении запроса на сервер создает новый поток, как следствие такой реализации ограничение по количеству потоков накладывается на процессор физического сервера, на котором запускается приложения, а количество виртуальных потоков может быть
неограниченным.
Реализуем веб-сервис на языке Java. Для этого будем использовать среду разработки Intellij IDE. В качестве средства сборки будем использовать Maven — это система управления зависимости, она является легковесной и простой в подключении и управления библиотеками приложения. В качестве фреймворка будет использоваться SpringBoot, в качестве библиотеки с реализацией реактивных потоков будет использоваться WebFlux — это реализация реактивного стэка от компании Spring и этот набор эффективнее сочетается с другими продуктами Spring.
Для подключения зависимости создается файл pom.xml и создается запись для загрузки зависимости.
<dependency^
cgroupldforg. springframework.boot</groupld> «artifact Id>spring-boot-starter-webfLuxc/artifactld> «/dependency*
Рис 2. Пример подключешш зависимости со стэком для реактивного программирования
Далее создадим контроллер приложения, который будет обрабатывать URL запросы и возвращать данные, запрашиваемые клиентами. Для этого создадим нужный маппинг и так же определим порт на котором веб-сервис будет работать и отдавать данные. Порт приложения будет 8080, а маппинг будет «/product». Запрос для получения данных будет следующего вида: localhost:8080/product.
Для уменьшения лишнего кода и скрытия его будут использоваться аннотации @RestController для создания веб контроллера и @RequestMapping для маппинга запросов.
@RestController [3RequestMappirig(" /product") public class ProductControLler i
РпсЗ. Пример создания контроллера
Далее создается список данных который будем возвращать, список будет реализован в виде типа данных ArrayList, то есть стандартный список. Затем создадим метод, в котором список будет возвращаться с использованием реактивной парадигмы и реактивного потока. Для этого список будет завернут в объект Mono — это объект, который создает реактивный поток при обращении за данными в контроллер.
В последствии необходимо создать альтернативный сервис с такими же данными, но без использования реактивного программирования, в которым основное отличие будет в том, что метод, который возвращает данные не будет создавать реактивный поток.
Нагрузка на два созданных сервиса при показателях 1000 запросов в 100 милисекунд на каждый из сервисов и отобразим результаты в таблице, где SpringMVC является стандартной реализацией, а SpringWebFlux является реализацией реактивной парадигмы.
1000 Users/100 ms
10 000 7 500 5 000 2 500 О
Spting MVC Spfing Wefaflux
Piic 4, Сравнение производительности веб сервисов
В заключение видим, что при использовании реактивного программирования, при нагрузке в 1000 пользователей в 100 милисекунд, скорость обработки и передачи данных работает в 2 раза быстрее, чем при обычном объектно ориентированном подходе. Данный результат достигается путем увеличенного объема потоков для каждого запроса и более низкой загруженности веб приложения.
Список литературы
1. Реактивное программирование с использованием RxJava Авторы Томаш Нуркевич, Бен Кристенсен
2. Реактивные шаблоны проектирования Авторы: Роланд Кун
3. Объектно-ориентированное проектирование. Концепции и программный код Авторы Гаст Хольгер
4. Распределенные системы реального времени. Теория и практика Авторы Эрджиес Кайхан
References
1. Reactive programming using RxJava Authors Tomasz Nurkiewicz, Ben Christensen
2. Reactive Design Patterns Authors: Roland Kuhn
3. Object-oriented design. Concepts and program code Authors Gast Holger
4. Distributed real-time systems. Theory and Practice By Erciyes Kayhan