[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-reactive-chto-takoe-backpressure-v-kontekste-reaktivnogo-programmirovaniya":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},989,"chto-takoe-backpressure-v-kontekste-reaktivnogo-programmirovaniya",31,"reactive","Reactive","⚡","Что такое backpressure в контексте реактивного программирования?","Backpressure — механизм управления потоком данных, когда производитель (Publisher) генерирует данные быстрее, чем потребитель (Subscriber) может их обработать.\n\n> Аналогия из жизни: backpressure — это как кран с водой и стакан. Если лить быстрее, чем стакан наполняется и опустошается, вода переливается. Backpressure позволяет потребителю регулировать напор крана.\n\n### Почему важно backpressure\n\nБез управления backpressure возникают:\n\n- Memory Overflow — необработанные элементы накапливаются в памяти\n- Latency Increase — растёт очередь необработанных элементов\n- Resource Exhaustion — исчерпание CPU и памяти, сбои системы\n\n### Стратегии управления backpressure в Project Reactor\n\n| Стратегия | Оператор | Описание |\n|-----------|----------|----------|\n| Буферизация | `onBackpressureBuffer(100)` | Элементы хранятся в буфере до обработки |\n| Отбрасывание | `onBackpressureDrop()` | Лишние элементы отбрасываются |\n| Новейшие | `onBackpressureLatest()` | Сохраняется только последний элемент |\n| Ошибка | `onBackpressureError()` | Сигнал об ошибке при переполнении |\n| Контроль запроса | `request(n)` | Явный контроль скорости запроса элементов |\n\n\u003Cdetails>\u003Csummary>Пример: буферизация\u003C\u002Fsummary>\n\n```java\nimport reactor.core.publisher.Flux;\nimport reactor.core.scheduler.Schedulers;\n\npublic class BackpressureExample {\n\n    public static void main(String[] args) {\n        Flux\u003CInteger> flux = Flux.range(1, 1000)\n                .onBackpressureBuffer(100);\n\n        flux.publishOn(Schedulers.boundedElastic())\n            .subscribe(\n                item -> {\n                    try {\n                        Thread.sleep(10); \u002F\u002F Имитируем медленного потребителя\n                        System.out.println(\"Received: \" + item);\n                    } catch (InterruptedException e) {\n                        e.printStackTrace();\n                    }\n                },\n                error -> System.err.println(\"Error: \" + error),\n                () -> System.out.println(\"All items received\")\n            );\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\u003Csummary>Пример: контроль скорости запроса через BaseSubscriber\u003C\u002Fsummary>\n\n```java\nimport reactor.core.publisher.BaseSubscriber;\nimport reactor.core.publisher.Flux;\n\npublic class ControlledRequestExample {\n\n    public static void main(String[] args) {\n        Flux\u003CInteger> flux = Flux.range(1, 1000);\n\n        flux.subscribe(new BaseSubscriber\u003CInteger>() {\n            @Override\n            protected void hookOnSubscribe(Subscription subscription) {\n                request(1); \u002F\u002F Запрашиваем один элемент при подписке\n            }\n\n            @Override\n            protected void hookOnNext(Integer value) {\n                try {\n                    Thread.sleep(10);\n                    System.out.println(\"Received: \" + value);\n                    request(1); \u002F\u002F Запрашиваем следующий элемент после обработки\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n\n            @Override\n            protected void hookOnComplete() {\n                System.out.println(\"All items received\");\n            }\n\n            @Override\n            protected void hookOnError(Throwable throwable) {\n                System.err.println(\"Error: \" + throwable.getMessage());\n            }\n        });\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** интервьюер хочет услышать, что backpressure — это не просто буфер, а протокол: потребитель через request(n) сообщает производителю, сколько данных он готов принять. Частая ошибка — назвать только одну стратегию (обычно буферизацию), не упомянув drop, latest, error и явный request(n).","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":19,"featuredSnippetReady":22},"Что такое backpressure в контексте реактивного программирова — Gymterview","Backpressure — механизм управления потоком данных, когда производитель (Publisher) генерирует данные быстрее, чем потребитель (Subscriber) может их обработать.","Backpressure — механизм управления потоком данных, когда производитель (Publisher) генерирует данные быстрее, чем потреб",[7,13],true]