Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[SnowOne 2024] Сергей Петрелевич: Виртуальные потоки в SpringBoot

jugnsk
April 30, 2024

[SnowOne 2024] Сергей Петрелевич: Виртуальные потоки в SpringBoot

В ходе доклада разберемся как виртуальные потоки java 21 можно использовать в приложениях на SpringBoot.

Затронем вопрос, как в SpringBoot реализовали обратную совместимость с предыдущими версиями java. Т.е. как одна и та же версия SpringBoot может и использовать новые классы java 21 и работать на предыдущих релизах java.

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

Сравним производительность встроенных популярных контейнеров сервлетов.

jugnsk

April 30, 2024
Tweet

More Decks by jugnsk

Other Decks in Programming

Transcript

  1. Кто Я? Петрелевич Сергей В IT «со времен Спектрума». В

    профессиональной разработке с 2003 года. Программировал на QNX, C/C++, Oracle PL/SQL. В последние годы в основном использую Java в разных вариациях. В основном работаю в финансовой сфере. Работал в московском тех центре Deutsche Bank, Райффайзенбанк, Мир. Сейчас работаю в компании Squad. 2
  2. ПРОБЛЕМАТИКА Java – приложения – не самые эффективные пользователи ресурсов.

    Рассмотрим один из архитектурных вариантов оптимизации. 3
  3. Архитектурные варианты 4 Client 1 Client N Server Thread 1

    Thread N Client 1 Client N Server Thread Много клиентов – один поток (Nio, Netty) Один клиент – один поток (TomCat)
  4. Java 21. Virtual Threads 6 Один «традиционный» (платформенный) поток Java

    может работать со множеством клиентов одновременно.
  5. Virtual Threads. Для чего хороши? 7 Если надо что-то подождать,

    например I/O, то пусть это делает дешевый Virtual Thread
  6. Virtual Threads. SpringBoot как включить? 11 А на основе enum:

    @ConditionalOnThreading – новая аннотация в семействе conditionalOn*.
  7. SpringBoot. @Async 13 Class AsyncExecutionInterceptor Использует deprecated SimpleAsyncTaskExecutor SimpleAsyncTaskExecutor deprecated,

    т.к. создает новый поток для выполнения новой задачи. Но сейчас именно это нам и надо.
  8. SpringBoot. SimpleAsyncTaskExecutor 14 Интересно, что сейчас этот класс и «Deprecated»

    и «не-Deprecated» в зависимости от варианта использования.
  9. Обратная совместимость 23 SpringFramework поддерживает Virtual Thread, но как это

    работает на java 17? Class VirtualThreadDelegate две реализации: https://github.com/spring-projects/spring-framework/blob/main/spring- core/src/main /java21/org/springframework/core/task/VirtualThreadDelegate.java https://github.com/spring-projects/spring-framework/blob/main/spring- core/src/main /java/org/springframework/core/task/VirtualThreadDelegate.java
  10. Обратная совместимость. VirtualThreadDelegate 24 Как собирается jar ? https://melix.github.io/mrjar-gradle-plugin/0.1/index.html support

    for building and testing multi-release jars with Gradle Как выполняется jar ? https://openjdk.org/jeps/238 JEP 238: Multi-Release JAR Files
  11. Idea. Navigation into multi-release JARs 26 Пока делался доклад Idea

    улучшалась. https://youtrack.jetbrains.com/issue/IDEA-341317/Navigation-into-multi-release-JARs Теперь это так:
  12. Демонстрационное приложение 28 А как же оптимизация приложения? Рассмотрим на

    примере Rest-сервис с блокирующим api c использованием: Tomcat Jetty Undertow
  13. Демонстрационное приложение 29 Особенности: - rest-интерфейс; - наличие блокирующего api;

    - сотни параллельных клиентов; - минимальное потребление памяти.
  14. Как настроить сервлеты? TomCat 31 class EmbeddedWebServerFactoryCustomizerAutoConfiguration В нем: @ConditionalOnThreading(Threading.VIRTUAL)

    TomcatVirtualThreadsWebServerFactoryCustomizer tomcatVirtualThreadsProtocolHandlerCustomizer() в нем используется org.apache.tomcat.util.threads.VirtualThreadExecutor;
  15. Как настроить сервлеты? Jetty 32 class EmbeddedWebServerFactoryCustomizerAutoConfiguration В нем: @ConditionalOnThreading(Threading.VIRTUAL)

    JettyVirtualThreadsWebServerFactoryCustomizer jettyVirtualThreadsWebServerFactoryCustomizer() в нем используется org.eclipse.jetty.util.VirtualThreads;
  16. Как настроить сервлеты? Undertow 34 Автоконфиг для Undertow Обещают добавить

    в SpringBoot 3.3: https://github.com/spring-projects/spring-boot/issues/38819 Autoconfigure Undertow/XNIO for virtual thread support А пока сделаем это руками 
  17. Сравнение производительности 37 ./hey -n=100000 -c=400 Virtual, sec Platform, sec

    Tomcat 170 X Jetty X X Undertow 150 3131 ./hey -n=100000 -c=300 Virtual, sec Platform, sec Tomcat 195 289 Jetty 196 336 Undertow 185 3128 280 мб (261 сек) Базовый вариант: 128 мб В таблицах средние значения, отклонение ~10-15 sec
  18. Что случилось с Jetty? 39 И это с виртуальными потоками.

    Exception in thread "qtp1603729058-28" java.lang.OutOfMemoryError: Java heap space HTTP request -> class QueuedThreadPool В QueuedThreadPool создаются потоки qtp* а в них уже выполняется AdaptiveExecutionStrategy и используютсяVirtual Thread. Про хитрые и разнообразные стратегии Jetty и Mechanical sympathy : https://webtide.com/jetty-12-virtual-threads-support/
  19. А кто такой Undertow? 40 https://undertow.io Undertow is a flexible

    performant web server written in java, providing both blocking and non-blocking API’s based on NIO. Undertow основан на event loop (NIO), поэтому требует особый подход в работе с блокирующим кодом. “Вызов блокирующего API в Spring WebFlux” https://youtu.be/1OERuVTs_LE?si=BZT13Z8qVvKInITN
  20. TomCat, Jetty, Undertow – что взять? 41 Надо учитывать экстремальный

    характер теста. Выделено всего: 128 мб, 1 cpu. При этом достаточно большая нагрузка: ~400 параллельных запросов. И требование: минимальное потребление памяти. Надо выбирать конкретный инструмент под конкретное применение.
  21. Что в итоге? 42 Virtual Thread позволяют эффективнее использовать ресурсы,

    без усложнения кода. Но с некоторыми нюансами…