[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-reactive-reaktivnyy-vs-imperativnyy-podkhod-kogda-chto-ispolzovat":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},1003,"reaktivnyy-vs-imperativnyy-podkhod-kogda-chto-ispolzovat",31,"reactive","Reactive","⚡","Реактивный vs императивный подход — когда что использовать?","Выбор между реактивным и императивным подходом — архитектурное решение, зависящее от требований к конкурентности, стека технологий и опыта команды.\n\n### Сравнение подходов\n\n| Критерий | Императивный | Реактивный |\n|----------|-------------|-----------|\n| Читаемость | Высокая, линейный код | Ниже, цепочки операторов |\n| Отладка | Простая, понятный стектрейс | Сложная, длинные трейсы |\n| Порог входа | Низкий | Высокий |\n| Throughput при I\u002FO | Ограничен пулом потоков | Высокий (event-loop) |\n| Потребление памяти | ~1 MB на поток | Минимальное |\n| Streaming | Ограниченный | Нативный |\n| Экосистема | Полная (JPA, JDBC, все библиотеки) | Ограниченная (R2DBC, WebClient) |\n\n\u003Cdetails>\u003Csummary>Сравнение кода: императивный vs реактивный vs Virtual Threads\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Императивный (Spring MVC)\n@GetMapping(\"\u002Forders\u002F{id}\")\npublic OrderDto getOrder(@PathVariable Long id) {\n    Order order = orderRepository.findById(id)\n            .orElseThrow(() -> new NotFoundException(\"Order not found\"));\n    User user = userService.getUser(order.getUserId());\n    List\u003CItem> items = itemService.getItems(order.getId());\n    return OrderDto.from(order, user, items);\n}\n\n\u002F\u002F Реактивный (Spring WebFlux)\n@GetMapping(\"\u002Forders\u002F{id}\")\npublic Mono\u003COrderDto> getOrder(@PathVariable Long id) {\n    return orderRepository.findById(id)\n        .switchIfEmpty(Mono.error(new NotFoundException(\"Order not found\")))\n        .flatMap(order -> Mono.zip(\n            userService.getUser(order.getUserId()),\n            itemService.getItems(order.getId()).collectList(),\n            (user, items) -> OrderDto.from(order, user, items)\n        ));\n}\n\n\u002F\u002F Virtual Threads (Java 21+ Spring MVC)\n\u002F\u002F application.yml: spring.threads.virtual.enabled=true\n@GetMapping(\"\u002Forders\u002F{id}\")\npublic OrderDto getOrder(@PathVariable Long id) {\n    \u002F\u002F Тот же блокирующий код, но на виртуальных потоках\n    Order order = orderRepository.findById(id).orElseThrow();\n    User user = userService.getUser(order.getUserId());\n    List\u003CItem> items = itemService.getItems(order.getId());\n    return OrderDto.from(order, user, items);\n}\n```\n\n\u003C\u002Fdetails>\n\n### Когда выбирать реактивный подход\n\n- Streaming-сценарии (SSE, WebSocket, бесконечные потоки данных)\n- Уже реактивный стек (R2DBC, reactive MongoDB, reactive Kafka)\n- API Gateway \u002F BFF с высокой конкурентностью\n- Сложная оркестрация асинхронных вызовов с backpressure\n\n### Когда выбирать императивный подход\n\n- Типичные CRUD-приложения\n- Работа с JPA\u002FHibernate, блокирующими библиотеками\n- Команда без опыта реактивного программирования\n- Java 21+ с Virtual Threads доступна\n\n### Частые ошибки\n\n- «Реактивный = быстрый» — реактивный подход не ускоряет отдельный запрос, он повышает throughput при высокой конкурентности\n- Частичная реактивность — один блокирующий вызов в реактивной цепочке уничтожает все преимущества\n- Переход на WebFlux без реактивной БД — JDBC через `boundedElastic` — компромисс, а не решение\n- Выбор технологии по моде — технический долг от неоправданного усложнения стоит дорого\n\n### Как используется в 2026\n\n- Чёткое разделение: WebFlux — для streaming и edge-сервисов, MVC + Virtual Threads — для бизнес-логики\n- Spring Boot 3.2+: `spring.threads.virtual.enabled=true` переключает MVC на Virtual Threads одной строкой\n- Прагматичный тренд: «используй реактивность только там, где она даёт измеримое преимущество»\n- Можно комбинировать: MVC-контроллеры + WebClient для исходящих запросов\n\n> **На собеседовании:** это вопрос senior-уровня — интервьюер ожидает аргументированный ответ с trade-offs, а не «WebFlux лучше». Назовите три сценария для реактивности и три для императивного подхода. Частая ошибка — не упомянуть Virtual Threads как третий путь, который в 2026 покрывает 80% сценариев.","","senior",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":19,"featuredSnippetReady":22},"Реактивный vs императивный подход — когда что использовать? — Gymterview","Выбор между реактивным и императивным подходом — архитектурное решение, зависящее от требований к конкурентности, стека технологий и опыта команды.","Выбор между реактивным и императивным подходом — архитектурное решение, зависящее от требований к конкурентности, стека ",[7,13],true]