middle
Что такое Reactive Streams Specification?
Reactive Streams — спецификация, определяющая стандарт для асинхронной потоковой обработки данных с поддержкой неблокирующего backpressure. Разработана совместно инженерами Netflix, Pivotal, Lightbend и Oracle; с Java 9 включена в JDK как java.util.concurrent.Flow.
Четыре ключевых интерфейса
Пример
// 1. Publisher — источник данных
public interface Publisher<T> {
void subscribe(Subscriber<? super T> subscriber);
}
// 2. Subscriber — потребитель данных
public interface Subscriber<T> {
void onSubscribe(Subscription subscription); // вызывается при подписке
void onNext(T item); // получение элемента
void onError(Throwable throwable); // сигнал об ошибке (терминальный)
void onComplete(); // сигнал о завершении (терминальный)
}
// 3. Subscription — связь Publisher-Subscriber, управление backpressure
public interface Subscription {
void request(long n); // запросить n элементов
void cancel(); // отменить подписку
}
// 4. Processor — комбинация Publisher и Subscriber
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
Протокол взаимодействия
- Subscriber вызывает
publisher.subscribe(subscriber) - Publisher вызывает
subscriber.onSubscribe(subscription) - Subscriber вызывает
subscription.request(n)— запрашивает n элементов - Publisher вызывает
subscriber.onNext(item)не более n раз - Publisher завершает поток вызовом
onComplete()илиonError()
Реализации спецификации
| Реализация | Компания | Где используется |
|---|---|---|
| Project Reactor | Pivotal/VMware | Spring WebFlux |
| RxJava | Netflix | Android-разработка |
| Mutiny | Red Hat | Quarkus |
| Akka Streams | Lightbend | Экосистема Akka |
Частые ошибки
- Не вызывать
request(n)— без запроса Publisher не отправит ни одного элемента - Вызывать
onNextпосле терминального сигнала — нарушение протокола - Бросать исключения из
onNext— вместо этого нужно вызватьsubscription.cancel() - Путать
FlowAPI из JDK и Reactive Streams API — интерфейсы идентичны, но в разных пакетах
Как используется в 2026
- Reactive Streams — зрелый стандарт, входящий в JDK
- Project Reactor — доминирующая реализация в Spring-экосистеме
- С появлением Virtual Threads (Java 21) часть задач решается проще через виртуальные потоки
- Reactive Streams незаменимы для streaming-сценариев (SSE, WebSocket, Kafka) и работы с backpressure
На собеседовании: ключевое — назвать четыре интерфейса и объяснить протокол, особенно роль request(n) в backpressure. Частая ошибка — знать только Mono/Flux из Reactor, но не понимать, что под ними лежит стандартная спецификация с чётким протоколом.