Reactive Streams
Reactive Streams 在 Netflix 、Pivotal 和 Lightbend 工程师于 2013 年底发起这项计划。
Reactive Streams 是一项提议,为无阻塞背压的异步流提供一个标准。这包括针对运行时环境(JVM 和 JavaScript)以及网络协议上的工作。
你可以在 Reactive Streams 官网网站阅读这个原始规范。
你也可以在 这里 阅读它的中文翻译。
无阻塞背压的异步流处理
Reactive Streams 由以下组成:
- 异步;
- 流式;
- 无阻塞;
- 背压(回压)。
以下是 Java 接口,你可以在 GitHub 阅读更详细内容。
public interface Publisher<T> {
public void subscribe(Subscriber<? super T> s);
}
public interface Subscriber<T> {
public void onSubscribe(Subscription s);
public void onNext(T t);
public void onError(Throwable t);
public void onComplete();
}
public interface Subscription {
public void request(long n);
public void cancel();
}
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}
Reactive Extensions
用于可观察流的异步编程 API。
ReactiveX 是来自观察者模式、迭代器模式以及函数式编程的最佳创意组合。
Project Reactor
Reactor 是第四代 Reactive 函数库,基于 Reactive Streams 规范 在 JVM 上构建无阻塞应用。
- 可组合性和可读性
- 以丰富的操作符方法操作数据流
- 订阅之前没有任何反应
- 背压或者消费者具有通知生产者生产速率过高能力
- 并发上的高级抽象
功能:
- 完全无阻塞;
- 集成 Java API:
Completable Future
Stream
Duration
Flux
和Mono
Flux
:一个 Reactive Streams 发布者,具有 rx 操作符,它发出 0 到 N 个元素,然后完成。Mono
:一个 Reactive Streams 发布者,具有 rx 操作符,发出 一个 元素成功完成,或者一个异常。
- 实现了 Reactive Streams 规范。
你可以在 GitHub 阅读更多细节。
当然,你可以根据这个 快速上手 Rx API 来学习基础的接口。
这里有个 帮助你如何选择操作符
Reactor Netty
Reactor Netty
基于Netty
框架,提供无阻塞和背压就绪的TCP
/HTTP
/UDP
客户端和服务端。
Spring Reactor WebFlux
Reactive 技术栈的网络框架,Spring WebFlux,在 5.0版本后期加入。它是完全无阻塞,支持 Reactive Streams 背压,并且在 Netty、Undertow 以及 Servlet .3.1+ 等服务器上运行。
RSocket
基于 Reactive Sreams 背压的一个二进制协议
功能:
- 双向的
- 多路复用
- 基于消息(message driven)
- 二进制协议
交互模型:
- 请求-响应( 1 对 1 )
- 发送 - 忘却 ( 1 对 0 UDP)
- 请求 - 流式( 1 对多,发布 / 订阅)
- 请求 - 通道 (多对多)
通信协议
- WebSocket
- TCP
- UDP
总结
Reactive Streams 是一个规范。
Project Reactor 是基于规范的 JVM 实现。
Spring WebFlux 是 Spring 框架集成 Project Reactor。
RSocket 是基于规范二进制协议实现。