[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-reactive-chto-takoe-sinks-v-project-reactor":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},1000,"chto-takoe-sinks-v-project-reactor",31,"reactive","Reactive","⚡","Что такое Sinks в Project Reactor?","Sinks — программно управляемые издатели данных в Project Reactor, пришедшие на замену deprecated FluxProcessor и MonoProcessor (Reactor 3.4+). Sinks позволяют императивно отправлять данные в реактивный поток.\n\n> Аналогия из жизни: Sinks — это как микрофон на сцене. Вы говорите в микрофон (императивно отправляете данные), а все слушатели (подписчики) одновременно слышат вас через динамики (реактивный поток).\n\n### Зачем нужны Sinks\n\nКогда источник данных не является «естественно реактивным» (callback-API, WebSocket, очередь событий), Sinks мостят императивный и реактивный миры.\n\n### Типы Sinks\n\n| Тип | Аналог | Описание |\n|-----|--------|----------|\n| `Sinks.One\u003CT>` | Mono | Эмитирует 0 или 1 элемент |\n| `Sinks.Many\u003CT>` unicast | Flux (1 подписчик) | Только один подписчик |\n| `Sinks.Many\u003CT>` multicast | Flux (N подписчиков) | Каждый получает элементы с момента подписки |\n| `Sinks.Many\u003CT>` replay | Flux (N подписчиков + история) | Новые подписчики получают N последних элементов |\n\n```java\n\u002F\u002F Sinks.One — аналог Mono\nSinks.One\u003CString> sink = Sinks.one();\nMono\u003CString> mono = sink.asMono();\nsink.tryEmitValue(\"result\");\n\n\u002F\u002F Sinks.Many — multicast\nSinks.Many\u003CString> sink = Sinks.many().multicast().onBackpressureBuffer();\nFlux\u003CString> flux = sink.asFlux();\nsink.tryEmitNext(\"event1\");\nsink.tryEmitNext(\"event2\");\nsink.tryEmitComplete();\n\n\u002F\u002F Sinks.Many — replay (с историей)\nSinks.Many\u003CString> replay = Sinks.many().replay().limit(10);\n```\n\n\u003Cdetails>\u003Csummary>Практический пример — чат через WebSocket\u003C\u002Fsummary>\n\n```java\n@Component\npublic class ChatService {\n    private final Sinks.Many\u003CChatMessage> chatSink =\n        Sinks.many().multicast().onBackpressureBuffer();\n\n    public void sendMessage(ChatMessage message) {\n        chatSink.tryEmitNext(message);\n    }\n\n    public Flux\u003CChatMessage> getMessages() {\n        return chatSink.asFlux();\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Обработка результата эмиссии\n\n```java\nSinks.Many\u003CString> sink = Sinks.many().multicast().onBackpressureBuffer();\n\nSinks.EmitResult result = sink.tryEmitNext(\"data\");\nif (result.isFailure()) {\n    \u002F\u002F FAIL_ZERO_SUBSCRIBER, FAIL_OVERFLOW, FAIL_CANCELLED, FAIL_TERMINATED\n    log.warn(\"Не удалось отправить: {}\", result);\n}\n\n\u002F\u002F Или с автоматической обработкой:\nsink.emitNext(\"data\", Sinks.EmitFailureHandler.FAIL_FAST);\n```\n\n### Частые ошибки\n\n- Использовать deprecated `FluxProcessor` — заменён на Sinks с Reactor 3.4\n- Игнорировать `EmitResult` — без подписчиков или при переполнении данные теряются молча\n- Использовать `unicast` с несколькими подписчиками — второй получит `IllegalStateException`\n- Не вызывать `tryEmitComplete()` — подписчики будут ждать бесконечно\n\n### Как используется в 2026\n\n- Sinks — стандартный способ мостить императивный и реактивный код\n- Широко используется в WebSocket\u002FSSE-обработчиках\n- Для event-driven архитектуры внутри приложения\n- С Virtual Threads потребность снижается, но для broadcast-сценариев Sinks оптимальны\n\n> **На собеседовании:** ключевое — объяснить, зачем нужны Sinks (мост между императивным и реактивным кодом) и назвать три режима Many: unicast, multicast, replay. Частая ошибка — не знать про EmitResult и не проверять результат эмиссии.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое Sinks в Project Reactor? — Gymterview","Sinks — программно управляемые издатели данных в Project Reactor, пришедшие на замену deprecated FluxProcessor и MonoProcessor (Reactor 3.4+). Sinks позволяют и","Sinks — программно управляемые издатели данных в Project Reactor, пришедшие на замену deprecated FluxProcessor и MonoPro",[7,13],"Sinks — программно управляемые издатели данных в Project Reactor, пришедшие на замену deprecated FluxProcessor и MonoProcessor (Reactor 3.4+). Sinks позволяют императивно отправлять данные в реактивный поток.",true]