---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.6
alternate:
  - https://ytsaurus.tech/docs/en/flow/java/examples/async_request.md
  - https://ytsaurus.tech/docs/ru/flow/java/examples/async_request.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ytsaurus.tech/docs/ru/llms.txt

<!-- source: ru/_includes/flow/java/examples/async_request.md -->
# Async Request в YTsaurus Flow (Java)

Данный пример [пайплайна](https://ytsaurus.tech/docs/ru/flow/concepts/glossary.md#pipeline) реализует событийно-ориентированный цикл запрос–ответ. Входящие события порождают запросы к обработчику, ответы возвращаются обратно в тот же компьютейшен и накапливаются во внешнем [стейте](https://ytsaurus.tech/docs/ru/flow/concepts/glossary.md#state). Пример демонстрирует циклическую топологию пайплайна и совместное использование внешнего стейта.

[Исходный код (Java)](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/examples/java/async_request)

[Исходный код (Kotlin)](https://github.com/ytsaurus/ytsaurus/tree/main/yt/yt/flow/examples/kotlin/async_request)
## Компоненты

### StateKeeperFunction

Обрабатывает два входных [стрима](https://ytsaurus.tech/docs/ru/flow/concepts/glossary.md#stream-and-computation) — `event` и `response`. По событию `event` генерирует запрос с уникальным `request_id` и эмитирует его в стрим `request`. По событию `response` накапливает суммарную длину ответов в поле `total_length` внешнего стейта:

{% list tabs group=lang %}

- Java

  {% code '/yt/yt/flow/examples/java/async_request/async_request/src/main/java/tech/ytsaurus/flow/examples/asyncrequest/StateKeeperFunction.java' lang='java' lines='[BEGIN on_message]-[END on_message]' keep-indents %}

- Kotlin

  {% code '/yt/yt/flow/examples/kotlin/async_request/async_request/src/main/kotlin/tech/ytsaurus/flow/examples/asyncrequest/StateKeeperFunction.kt' lang='kotlin' lines='[BEGIN on_message]-[END on_message]' keep-indents %}

{% endlist %}

### RequestProcessorFunction

Stateless-компьютейшен: получает запрос из стрима `request`, вычисляет длину строки и немедленно отправляет ответ в стрим `response`:

{% list tabs group=lang %}

- Java

  {% code '/yt/yt/flow/examples/java/async_request/async_request/src/main/java/tech/ytsaurus/flow/examples/asyncrequest/RequestProcessorFunction.java' lang='java' lines='[BEGIN on_message]-[END on_message]' keep-indents %}

- Kotlin

  {% code '/yt/yt/flow/examples/kotlin/async_request/async_request/src/main/kotlin/tech/ytsaurus/flow/examples/asyncrequest/RequestProcessorFunction.kt' lang='kotlin' lines='[BEGIN on_message]-[END on_message]' keep-indents %}

{% endlist %}

### Регистрация компьютейшенов

Компьютейшены `state` и `processor` регистрируются аннотацией `@FlowComputation` на классах их process-функций:

{% list tabs group=lang %}

- Java

  {% code '/yt/yt/flow/examples/java/async_request/async_request/src/main/java/tech/ytsaurus/flow/examples/asyncrequest/StateKeeperFunction.java' lang='java' lines='[BEGIN registration]-[END registration]' %}

  {% code '/yt/yt/flow/examples/java/async_request/async_request/src/main/java/tech/ytsaurus/flow/examples/asyncrequest/RequestProcessorFunction.java' lang='java' lines='[BEGIN registration]-[END registration]' %}

- Kotlin

  {% code '/yt/yt/flow/examples/kotlin/async_request/async_request/src/main/kotlin/tech/ytsaurus/flow/examples/asyncrequest/StateKeeperFunction.kt' lang='kotlin' lines='[BEGIN registration]-[END registration]' %}

  {% code '/yt/yt/flow/examples/kotlin/async_request/async_request/src/main/kotlin/tech/ytsaurus/flow/examples/asyncrequest/RequestProcessorFunction.kt' lang='kotlin' lines='[BEGIN registration]-[END registration]' %}

{% endlist %}

### PipelineMain

Единственная точка входа (запускает пайплайн или обслуживает его как компаньон — по `YT_FLOW_MODE`):

{% list tabs group=lang %}

- Java

  {% code '/yt/yt/flow/examples/java/async_request/async_request/src/main/java/tech/ytsaurus/flow/examples/asyncrequest/PipelineMain.java' lang='java' lines='[BEGIN main]-[END main]' keep-indents %}

- Kotlin

  {% code '/yt/yt/flow/examples/kotlin/async_request/async_request/src/main/kotlin/tech/ytsaurus/flow/examples/asyncrequest/PipelineMain.kt' lang='kotlin' lines='[BEGIN main]-[END main]' keep-indents %}

{% endlist %}

## Ключевые паттерны

- **Циклическая топология** — стрим `response` возвращается обратно в `state`-компьютейшен, замыкая цикл `event → request → response → state`. Flow поддерживает такие графы явно.
- **Маршрутизация по `streamId`** — одна функция обрабатывает несколько входных стримов, определяя тип сообщения через `message.getStreamId()`.
- **ExternalStateAccessor с PayloadBuilder** — поле `total_length` обновляется точечно: `current.toBuilder()` → изменение → `stateAccessor.set(updated.finish())`.
- **Конфигурация через Spring Boot** — компьютейшены регистрируются аннотацией `@FlowComputation`; `flow-spring-boot-starter` управляет жизненным циклом gRPC-сервера.
<!-- endsource: ru/_includes/flow/java/examples/async_request.md -->

<!-- source: ru/_includes/flow/java/examples/async_request_also.md -->
## См. также

- [Быстрый старт (Java)](https://ytsaurus.tech/docs/ru/flow/java/getting-started.md)
- [Computation (Java)](https://ytsaurus.tech/docs/ru/flow/java/computation.md)
- [Stateful processing](https://ytsaurus.tech/docs/ru/flow/concepts/stateful.md)
- [Аналогичный пример на C++](https://ytsaurus.tech/docs/ru/flow/cpp/examples/async_request.md)
- [Расширенная версия с ретраями](https://ytsaurus.tech/docs/ru/flow/java/examples/retryable_async_request.md)
<!-- endsource: ru/_includes/flow/java/examples/async_request_also.md -->
