diff --git a/dev/architecture/Блокирующий вызов.md b/dev/architecture/Блокирующий вызов.md index 4b3b61d8..9faef0b0 100644 --- a/dev/architecture/Блокирующий вызов.md +++ b/dev/architecture/Блокирующий вызов.md @@ -5,6 +5,7 @@ aliases: - блокирующий вызов - блокирующий ввод-вывод - блокирующего + - блокирующей операции tags: - maturity/🌱 date: diff --git a/dev/fundamental/Поток процесса ОС.md b/dev/fundamental/Поток процесса ОС.md index ecfa0494..396b2837 100644 --- a/dev/fundamental/Поток процесса ОС.md +++ b/dev/fundamental/Поток процесса ОС.md @@ -7,6 +7,9 @@ aliases: - нити ос - нити операционной системы - нить ос + - потоку + - потоком ОС + - потоку ОС tags: - maturity/🌱 date: 2024-01-28 @@ -14,7 +17,7 @@ zero-link: - "[[../../meta/zero/00 Архитектура ЭВМ|00 Архитектура ЭВМ]]" parents: - "[[Процесс ОС]]" -linked: +linked: --- Поток (или поток выполнения) — это легковесная единица выполнения, которая работает внутри [[Процесс ОС|процесса]]. Все потоки в пределах одного процесса делят между собой адресное пространство и ресурсы этого процесса, что позволяет им легко обмениваться данными и синхронизироваться. diff --git a/dev/java/Java 21 LTS.md b/dev/java/Java 21 LTS.md new file mode 100644 index 00000000..a7fb9cb8 --- /dev/null +++ b/dev/java/Java 21 LTS.md @@ -0,0 +1,25 @@ +--- +aliases: + - java 21 +tags: + - maturity/🌱 +date: "[[2023-11-08]]" +zero-link: [] +parents: +linked: +--- +- [[Java Virtual Threads|Java Virtual Threads]] +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]] +**Родитель**:: +**Источник**:: +**Автор**:: +**Создана**:: [[2023-11-08]] +### Дополнительные материалы +- +### Дочерние заметки + + +- [[Java Virtual Threads]] + diff --git a/dev/java/Java Virtual Threads.md b/dev/java/Java Virtual Threads.md new file mode 100644 index 00000000..5e977002 --- /dev/null +++ b/dev/java/Java Virtual Threads.md @@ -0,0 +1,32 @@ +--- +aliases: + - виртуальные потоки + - виртуальный поток + - виртуальных потоков +tags: + - maturity/🌱 +date: 2024-10-03 +zero-link: +parents: +linked: +--- +Виртуальный поток не привязан к конкретному [[../fundamental/Поток процесса ОС|потоку ОС]]. При вызове [[../architecture/Блокирующий вызов|блокирующей операции]] Java останавливает этот поток, до момента пока его можно будет вызвать. То есть мы освобождаем настоящий поток ОС, чтобы он не простаивал. + +![[../../../../garden/ru/meta/files/images/Pasted image 20241003081726.png]] + +В виртуальных потоках не рекомендуется использовать ThreadLocal. + +Виртуальный поток не поможет вам, если ваши операции требуют активной работы CPU. +*** +## Мета информация +**Область**:: [[../../../../garden/ru/meta/zero/00 Java разработка|00 Java разработка]] +**Родитель**:: [[../../../../garden/ru/dev/java/Java 21 LTS|Java 21 LTS]] +**Источник**:: +**Создана**:: [[2024-10-03]] +**Автор**:: +### Дополнительные материалы +- [Примеры · GitHub](https://github.com/petrelevich/jvm-digging/tree/master/virtual-thread) + +### Дочерние заметки + + diff --git a/meta/files/images/Pasted image 20241003080932.png b/meta/files/images/Pasted image 20241003080932.png new file mode 100644 index 00000000..9bb70b47 Binary files /dev/null and b/meta/files/images/Pasted image 20241003080932.png differ diff --git a/meta/files/images/Pasted image 20241003081345.png b/meta/files/images/Pasted image 20241003081345.png new file mode 100644 index 00000000..914655c1 Binary files /dev/null and b/meta/files/images/Pasted image 20241003081345.png differ diff --git a/meta/files/images/Pasted image 20241003081726.png b/meta/files/images/Pasted image 20241003081726.png new file mode 100644 index 00000000..d881db34 Binary files /dev/null and b/meta/files/images/Pasted image 20241003081726.png differ diff --git a/meta/files/images/Pasted image 20241003083724.png b/meta/files/images/Pasted image 20241003083724.png new file mode 100644 index 00000000..7ca50d50 Binary files /dev/null and b/meta/files/images/Pasted image 20241003083724.png differ diff --git a/meta/files/images/Pasted image 20241003083758.png b/meta/files/images/Pasted image 20241003083758.png new file mode 100644 index 00000000..5e1de759 Binary files /dev/null and b/meta/files/images/Pasted image 20241003083758.png differ diff --git a/meta/files/images/Pasted image 20241003084259.png b/meta/files/images/Pasted image 20241003084259.png new file mode 100644 index 00000000..8f5e17cc Binary files /dev/null and b/meta/files/images/Pasted image 20241003084259.png differ diff --git a/meta/files/images/comp/Pasted image 20241003080932.png b/meta/files/images/comp/Pasted image 20241003080932.png new file mode 100644 index 00000000..27329cd9 Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241003080932.png differ diff --git a/meta/files/images/comp/Pasted image 20241003080932.png.md5 b/meta/files/images/comp/Pasted image 20241003080932.png.md5 new file mode 100644 index 00000000..c1cca255 --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241003080932.png.md5 @@ -0,0 +1 @@ +de6bbeb59e7f968b70fba8fc6cd72488 diff --git a/meta/files/images/comp/Pasted image 20241003081345.png b/meta/files/images/comp/Pasted image 20241003081345.png new file mode 100644 index 00000000..0e3d6d42 Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241003081345.png differ diff --git a/meta/files/images/comp/Pasted image 20241003081345.png.md5 b/meta/files/images/comp/Pasted image 20241003081345.png.md5 new file mode 100644 index 00000000..e0bceeff --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241003081345.png.md5 @@ -0,0 +1 @@ +79ae40ee77e2be2b1b3487299c015919 diff --git a/meta/files/images/comp/Pasted image 20241003081726.png b/meta/files/images/comp/Pasted image 20241003081726.png new file mode 100644 index 00000000..8ba6e334 Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241003081726.png differ diff --git a/meta/files/images/comp/Pasted image 20241003081726.png.md5 b/meta/files/images/comp/Pasted image 20241003081726.png.md5 new file mode 100644 index 00000000..c44a7fbc --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241003081726.png.md5 @@ -0,0 +1 @@ +f3af942d08fb6dc05ffb50dac442572a diff --git a/meta/files/images/comp/Pasted image 20241003083724.png b/meta/files/images/comp/Pasted image 20241003083724.png new file mode 100644 index 00000000..eeca02a2 Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241003083724.png differ diff --git a/meta/files/images/comp/Pasted image 20241003083724.png.md5 b/meta/files/images/comp/Pasted image 20241003083724.png.md5 new file mode 100644 index 00000000..56b1c195 --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241003083724.png.md5 @@ -0,0 +1 @@ +7c464fc07c731c74abbc8291583a205d diff --git a/meta/files/images/comp/Pasted image 20241003083758.png b/meta/files/images/comp/Pasted image 20241003083758.png new file mode 100644 index 00000000..52fa6f59 Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241003083758.png differ diff --git a/meta/files/images/comp/Pasted image 20241003083758.png.md5 b/meta/files/images/comp/Pasted image 20241003083758.png.md5 new file mode 100644 index 00000000..debda2cc --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241003083758.png.md5 @@ -0,0 +1 @@ +de5dd568e4fd9931381d45c85ae1735a diff --git a/meta/files/images/comp/Pasted image 20241003084259.png b/meta/files/images/comp/Pasted image 20241003084259.png new file mode 100644 index 00000000..3cf3446f Binary files /dev/null and b/meta/files/images/comp/Pasted image 20241003084259.png differ diff --git a/meta/files/images/comp/Pasted image 20241003084259.png.md5 b/meta/files/images/comp/Pasted image 20241003084259.png.md5 new file mode 100644 index 00000000..c7fd4dad --- /dev/null +++ b/meta/files/images/comp/Pasted image 20241003084259.png.md5 @@ -0,0 +1 @@ +86bf2315bbfbc55772c532fb68d1de00 diff --git a/meta/files/images/webp/Pasted image 20241003080932.webp b/meta/files/images/webp/Pasted image 20241003080932.webp new file mode 100644 index 00000000..0ee8ef68 Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241003080932.webp differ diff --git a/meta/files/images/webp/Pasted image 20241003080932.webp.md5 b/meta/files/images/webp/Pasted image 20241003080932.webp.md5 new file mode 100644 index 00000000..c1cca255 --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241003080932.webp.md5 @@ -0,0 +1 @@ +de6bbeb59e7f968b70fba8fc6cd72488 diff --git a/meta/files/images/webp/Pasted image 20241003081345.webp b/meta/files/images/webp/Pasted image 20241003081345.webp new file mode 100644 index 00000000..f091823e Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241003081345.webp differ diff --git a/meta/files/images/webp/Pasted image 20241003081345.webp.md5 b/meta/files/images/webp/Pasted image 20241003081345.webp.md5 new file mode 100644 index 00000000..e0bceeff --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241003081345.webp.md5 @@ -0,0 +1 @@ +79ae40ee77e2be2b1b3487299c015919 diff --git a/meta/files/images/webp/Pasted image 20241003081726.webp b/meta/files/images/webp/Pasted image 20241003081726.webp new file mode 100644 index 00000000..39f3c20f Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241003081726.webp differ diff --git a/meta/files/images/webp/Pasted image 20241003081726.webp.md5 b/meta/files/images/webp/Pasted image 20241003081726.webp.md5 new file mode 100644 index 00000000..c44a7fbc --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241003081726.webp.md5 @@ -0,0 +1 @@ +f3af942d08fb6dc05ffb50dac442572a diff --git a/meta/files/images/webp/Pasted image 20241003083724.webp b/meta/files/images/webp/Pasted image 20241003083724.webp new file mode 100644 index 00000000..cb4ef040 Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241003083724.webp differ diff --git a/meta/files/images/webp/Pasted image 20241003083724.webp.md5 b/meta/files/images/webp/Pasted image 20241003083724.webp.md5 new file mode 100644 index 00000000..56b1c195 --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241003083724.webp.md5 @@ -0,0 +1 @@ +7c464fc07c731c74abbc8291583a205d diff --git a/meta/files/images/webp/Pasted image 20241003083758.webp b/meta/files/images/webp/Pasted image 20241003083758.webp new file mode 100644 index 00000000..1619f2f8 Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241003083758.webp differ diff --git a/meta/files/images/webp/Pasted image 20241003083758.webp.md5 b/meta/files/images/webp/Pasted image 20241003083758.webp.md5 new file mode 100644 index 00000000..debda2cc --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241003083758.webp.md5 @@ -0,0 +1 @@ +de5dd568e4fd9931381d45c85ae1735a diff --git a/meta/files/images/webp/Pasted image 20241003084259.webp b/meta/files/images/webp/Pasted image 20241003084259.webp new file mode 100644 index 00000000..e3062a20 Binary files /dev/null and b/meta/files/images/webp/Pasted image 20241003084259.webp differ diff --git a/meta/files/images/webp/Pasted image 20241003084259.webp.md5 b/meta/files/images/webp/Pasted image 20241003084259.webp.md5 new file mode 100644 index 00000000..c7fd4dad --- /dev/null +++ b/meta/files/images/webp/Pasted image 20241003084259.webp.md5 @@ -0,0 +1 @@ +86bf2315bbfbc55772c532fb68d1de00 diff --git a/meta/organizations/Т-Банк.md b/meta/organizations/Т-Банк.md new file mode 100644 index 00000000..8b69cdfa --- /dev/null +++ b/meta/organizations/Т-Банк.md @@ -0,0 +1,22 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-10-02 +zero-link: +parents: +linked: +--- + +*** +## Мета информация +**Область**:: +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-10-02]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + diff --git a/meta/people/Сергей Петрелевич.md b/meta/people/Сергей Петрелевич.md new file mode 100644 index 00000000..2625be22 --- /dev/null +++ b/meta/people/Сергей Петрелевич.md @@ -0,0 +1,14 @@ +--- +tags: + - type/people +date: "[[2024-10-02]]" +--- +**Work**:: +**Position**:: +**Создана**:: [[2024-10-02]] +**Telegram**:: +## Упоминается в заметках + + +- [[Доклад. Могут ли Virtual threads заменить Webflux]] + diff --git a/meta/people/Томас Эдисон.md b/meta/people/Томас Эдисон.md new file mode 100644 index 00000000..6062d12b --- /dev/null +++ b/meta/people/Томас Эдисон.md @@ -0,0 +1,14 @@ +--- +tags: + - type/people +date: "[[2024-10-02]]" +--- +**Work**:: +**Position**:: +**Создана**:: [[{date}]] +**Telegram**:: +## Упоминается в заметках + + +- [[Супрахиазматическое ядро]] + diff --git a/meta/zero/00 Java разработка.md b/meta/zero/00 Java разработка.md index 5fb969bd..364dc0ca 100644 --- a/meta/zero/00 Java разработка.md +++ b/meta/zero/00 Java разработка.md @@ -36,7 +36,7 @@ title: Java разработка - [Java 12](Java%2012.md) - [[Java 15]] - [[Java 17 LTS]] -- [[Java 21 LTS]] +- [[../../dev/java/Java 21 LTS|Java 21 LTS]] ## Дополнительно - [Нативные сборки в Java](../../dev/java/Нативные%20сборки%20в%20Java.md) diff --git a/source/00 Источники.md b/source/00 Источники.md new file mode 100644 index 00000000..478c5e56 --- /dev/null +++ b/source/00 Источники.md @@ -0,0 +1,14 @@ +--- +tags: + - type/zero-link +date: 2024-10-02 +--- +Здесь собраны ссылки на заметки, в которых я анализирую прочитанный/просмотренный материал. +## Доклады + + +- [[Доклад. Могут ли Virtual threads заменить Webflux]] +- [[Доклад]] + +## Статьи + diff --git a/source/conference/Конференция. JVM Day 2024.md b/source/conference/Конференция. JVM Day 2024.md new file mode 100644 index 00000000..6873376c --- /dev/null +++ b/source/conference/Конференция. JVM Day 2024.md @@ -0,0 +1,27 @@ +--- +aliases: +date: 2024-10-02 +zero-link: +parents: +linked: +--- +**Организатор**:: [[../../meta/organizations/Т-Банк|Т-Банк]] + +## Доклады + + +- [[Доклад. Могут ли Virtual threads заменить Webflux]] + + +*** +## Мета информация +**Область**:: +**Родитель**:: [[../../meta/organizations/Т-Банк|Т-Банк]] +**Источник**:: +**Создана**:: [[2024-10-02]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + diff --git a/source/lecture/Доклад. Могут ли Virtual threads заменить Webflux.md b/source/lecture/Доклад. Могут ли Virtual threads заменить Webflux.md new file mode 100644 index 00000000..4426af5b --- /dev/null +++ b/source/lecture/Доклад. Могут ли Virtual threads заменить Webflux.md @@ -0,0 +1,105 @@ +--- +aliases: +tags: + - maturity/🌱 + - type/source/lecture +date: 2024-10-02 +zero-link: +parents: +linked: +--- +**Организатор**:: [[../../meta/organizations/Т-Банк|Т-Банк]] +**Конференция**:: [[../conference/Конференция. JVM Day 2024|Конференция. JVM Day 2024]] +**Автор**:: [[../../meta/people/Сергей Петрелевич|Сергей Петрелевич]] +**Ссылка::** [Могут ли Virtual threads заменить Webflux? — Сергей Петрелевич, Squad - YouTube](https://www.youtube.com/watch?v=SOvzg-uoVco) + + +*** +**О чем доклад:** Автор пытается понять есть ли место реактивной парадигме в современной Java, после выхода [[../../dev/java/Java Virtual Threads|виртуальных потоков]]. Для этого он проводит нагрузочное тестирование и сравнивает результаты. + +## Тезисы +- Прикладным разработчикам удобнее работать с абстракциями высшего порядка (Spring WebFlux, Quarkus Reactive). +- Реактивный подход остается актуальным в некоторых задачах. Архитектору как и прежде необходимо выбирать подходящий инструмент для конкретной задачи. + - Виртуальные потоки могут дать существенный прирост (в 2 раза) производительности существующему приложению. + - Виртуальные потоки легко включить, от разработчика не требуется переписывать существующий код. + - Реактивный подход (Spring WebFlux) позволит дать максимальный прирост производительности (в 3.8 раза), но за это придется заплатить. + - [[../../../../knowledge/dev/Реактивное программирование|Реактивное программирование]] требует от разработчика изучение новой парадигмы и новых подходов: "функциональный" стиль разработки (Fluent API). +*** +## Конспект +Автор считает, что Java не самый эффективный язык программирования с точки зрения потребления ресурсов + +Имеется куча вариантов оптимизации, которые автор предлагает рассмотреть. Рассматривать начинаем с двух концепций +- [[../../dev/architecture/Один клиент — один поток|Один клиент — один поток]] + - С таким подходов в Java быстро доходим до пределов количества потоков, которые возможно создать + - Применим, если нагрузка на систему не большая +- [[../../dev/architecture/Много клиентов — один поток|Много клиентов — один поток]] + - Кажется, что это то что надо, но это не всегда так + +Автор рассматривает [[../../dev/architecture/Event Loop|Event Loop]]. Реализация в Java: NIO Selector. + +Можно работать напрямую с NIO, но прикладным разработчикам удобнее работать с Netty, который позволяет работать с более высокоуровневыми абстракциям, при этом сохраняя все преимущества NIO. Но есть еще более высокоуровневая абстракция поверх Netty. + +NIO посылает события Netty их преобразовывает в более удобный вид. Далее можно сделать [[../../../../_inbox/Callback|Callback-и]], на основе этого работает Vert.x. Второй подход это использовать реактивный API: Reactor Netty. Именно этот подход автор и будет рассматривать. + +![[../../meta/files/images/Pasted image 20241003080932.png]] + +Можно реализовывать свои приложения сразу на Reactor Netty, но еще удобнее использовать Spring Webflux. Это реактивный функциональный (позволяет разрабатывать в функциональном стиле) http-сервер, который эффективно использует ресурсы. + +Пример "функционального" подхода. Fluent API +![[../../meta/files/images/Pasted image 20241003081345.png]] + +Теперь рассмотрим [[../../dev/java/Java Virtual Threads|виртуальные потоки]], которые появились в Java 21. Один платформенный поток Java может работать со множеством клиентов одновременно. По сути виртуальный поток это объект класса, который выполняется на базе платформенного потока, который в свою очередь является фактически [[../../dev/fundamental/Поток процесса ОС|потоком ОС]]. + +![[../../../../garden/ru/meta/files/images/Pasted image 20241003081726.png]] + +Виртуальный поток помогает с операциями, где есть [[../../dev/architecture/Блокирующий вызов|блокирующие операции]], где нужно "подождать". В таком случае ожидание практически ничего не стоит, так как виртуальный поток на это время блокируется и уступает платформенный поток другому виртуальному потоку. Но если вам нужно что-то считать, если у вас какие-то тяжелые CPU задачи, то виртуальные потоки вам не подходят. + +Для работы с виртуальными потоками в SpingBoot достаточно включить одну проперти. + +Примеры: [jvm-digging/virtual-thread at master · petrelevich/jvm-digging · GitHub](https://github.com/petrelevich/jvm-digging/tree/master/virtual-thread) + +Итого, Sping WebFlux позволял нам обрабатывать множество запросов на одном потоке. И виртуальные потоки нам позволяют делать по сути то же самое. При этом не нужно разбираться в реактивной парадигме разработки. Тогда зачем нам WebFlux? + +## Сравнение производительности +Для этого сравним два подхода на примере [небольшого приложения](https://github.com/petrelevich/jvm-digging/tree/master/virtual-thread), которое будет принимать REST запросы и отправлять их в кафку, после чего отвечать клиенту что сообщение доставлено. + +![[../../meta/files/images/Pasted image 20241003083724.png]] + +![[../../meta/files/images/Pasted image 20241003083758.png]] + +Сравнение производительности. Генератор нагрузки: https://github.com/rakyll/hey + +``` +/hey -n=1000000 -C=300 +``` +- 300 клиентов отправляют 1000000 запросов +- Ethernet 1000 Mb/s +- Запускаем в докере: 256 Mb, 1 cpu. +- [[../../dev/java/gc/Garbage Collector|Garbage Collector]]: G1 +- Прогрев: два запуска +- Измерений: 7 +- Стандартное отклонение: 3,8; 3,7; 2,6 + +![[../../meta/files/images/Pasted image 20241003084259.png|500]] + +Прирост производительности: 200% Virtual Thread по сравнению с платформенными потоками, а если переключиться на Webflux, то мы получим **поверх** еще 30%. + +Переход на Virtual Thread максимально прост, при этом максимально эффективен. Поэтому особого смысла переписывать старые приложения на рекативной подход нет, проще включить виртуальные потоки. +### Причины +Почему Webflux производительней виртуальных потоков? +- Может быть, где-то в коде есть synchronized? События jdk.VirtualThreadPinned не фиксируются +- Замедление, наиболее вероятно, связано с переключением на платформенные потоки. JMC показывает множество событий: jdk.VirtualThreadStart, jdk.VirtualThreadEnd. При этом их длительность 0 (WTF?). +## Дополнительные материалы +- +*** +## Мета информация +**Область**:: +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-10-02]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки +