Со встроенными Tomcat и Jetty настроить реактивность сложнее и они, как минимум, должны поддерживать Servlet 3.1 (на момент написания статьи этого не было).
Не путайте встроенные в Spring 5 серверы с серверами поддерживающими Servlet 3.1. Я же специально проиллюстрировал (1я картинка) на чем базируется реактивный стэк.
На счет потоков. На разных уровнях под потоком понимается разное. Понятие поток в реактивном программировании (реактивный поток) это поток данных. Например Flux.merge(a, b, c) объединяет три потока. Для Netty поток, это скорее цепочка (или цикл) событий привязанных к определенным задачам. Здесь можно найти детали programmer.help/blogs/netty-basic-to-entry-2-netty-core-functions-and-thread-model.html A thread and task queue are maintained in NioEventLoop, which supports asynchronous submission and execution of tasks
На счет преимуществ нативного SQL над JPQL в плане быстродействия. Думаю, если провести голосование, то большинство отдаст голос в пользу SQL. Поэтому не такой уж я и смелый в своем мнении.) На более низком уровне, SQL позволяет оптимизировать запросы в том числе и сложные с JOIN. Но интересно, конечно почитать специальные исследования об этом (о производительности). Пока нашел только quares.ru/?id=164860 где автор не поленился проверить эквивалентные запросы. У него JPA в полтора раза замедлил запрос. Конечно, это не исследование, но…
Со встроенными Tomcat и Jetty настроить реактивность сложнее и они, как минимум, должны поддерживать Servlet 3.1 (на момент написания статьи этого не было).
[INFO ] 2021-07-03T15:17:18.268Z [main] org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean | | — Creating Service {urn:cam-ws}CamWSService from class ws.cam.CamWS
[DEBUG] 2021-07-03T15:17:20.031Z [reactor-tcp-nio-3] org.springframework.data.r2dbc.core.DefaultDatabaseClient | | — Executing SQL statement
[DEBUG] 2021-07-03T15:17:20.031Z [reactor-tcp-nio-4] org.springframework.data.r2dbc.core.DefaultDatabaseClient | | — Executing SQL statement
[DEBUG] 2021-07-03T15:17:20.031Z [reactor-tcp-nio-5] org.springframework.data.r2dbc.core.DefaultDatabaseClient | | — Executing SQL statement
[DEBUG] 2021-07-03T15:17:20.031Z [reactor-tcp-nio-2] org.springframework.data.r2dbc.core.DefaultDatabaseClient | | — Executing SQL statement
[DEBUG] 2021-07-03T15:17:20.031Z [reactor-tcp-nio-1] org.springframework.data.r2dbc.core.DefaultDatabaseClient | | — Executing SQL statement
На счет потоков. На разных уровнях под потоком понимается разное. Понятие поток в реактивном программировании (реактивный поток) это поток данных. Например Flux.merge(a, b, c) объединяет три потока. Для Netty поток, это скорее цепочка (или цикл) событий привязанных к определенным задачам. Здесь можно найти детали programmer.help/blogs/netty-basic-to-entry-2-netty-core-functions-and-thread-model.html A thread and task queue are maintained in NioEventLoop, which supports asynchronous submission and execution of tasks