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

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

Avatar for jugnsk jugnsk
April 30, 2024

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

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

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

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

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

Avatar for jugnsk

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 позволяют эффективнее использовать ресурсы,

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