О чём вебинар
Один и тот же сервис-агрегатор пишем тремя способами: блокирующим кодом, на CompletableFuture и на Project Reactor. Сравниваем время ответа, расход потоков и сложность кода и разбираем, когда какой подход окупается.
Сервис, который собирает ответ из нескольких медленных источников, есть почти в каждом проекте. Пока источников два, блокирующий код справляется.
Когда их пять и у каждого свой таймаут, потоки пула заканчиваются, а время ответа растет как сумма задержек.
На вебинаре разберем этот сценарий в живом коде.
Начнем с ExecutorService и Future, перейдем к конвейеру на CompletableFuture с обработкой ошибок и таймаутами, затем перепишем то же на Mono и Flux. На каждом шаге замерим время ответа и число занятых потоков.
Отдельно обсудим, что меняют виртуальные потоки Java 21 и в каких задачах реактивный подход дает больше.
Цели вебинара:
Показать на одном примере разницу блокирующей, асинхронной и реактивной моделей
Научить собирать асинхронный конвейер на CompletableFuture с обработкой ошибок и таймаутами
Дать критерии выбора модели асинхронности под нагрузку и задачу проекта
Предварительная подготовка:
Уверенное владение Java Core и Stream API
Базовое понимание многопоточности: потоки, пул потоков
Знание Spring желательно
Содержание
Блокирующий агрегатор: где теряются время и потоки
ExecutorService и Future: параллельные вызовы и их пределы
CompletableFuture: композиция через thenCombine и allOf, синхронные и асинхронные методы, обработка исключений, таймауты
Project Reactor: Mono и Flux, zip, timeout, retry, Schedulers
Обратное давление (backpressure): что происходит, когда потребитель медленнее источника
Виртуальные потоки Java 21: где они упрощают код и где выбор остается за реактивным стеком
Сравнение трех реализаций по времени ответа, числу потоков и читаемости кода
Другие разделы