前言
响应式流的网址是Reactive Streams。官方给出的目标是:
响应性流是为异步流处理提供无阻塞回压的标准。这包括针对运行时环境(JVM和JavaScript)以及网络协议的工作。
目前,JDK给出了java.util.concurrent.Flow接口来进行响应式编程。但是由于完全更新到JDK9还需要一段时间,所以需要开源的版本支持。
响应式流规范
响应式流给出一套接口规范,gradle地址是:
implementation 'org.reactivestreams:reactive-streams:1.0.3'
这套规范定义了四个接口,分别是:
org.reactivestreams.Publisher<T>
:发布者,发布数据。org.reactivestreams.Subscriber<T>
:订阅者,订阅数据。org.reactivestreams.Subscription<T>
:订阅,订阅者订阅发布者的一对一生命周期。org.reactivestreams.Processor<T>
:处理器,既能够发布数据,又能接收数据。
以上,就是响应式流的全部接口,和JDK9的Flow API对应。
ReactiveX实现
ReactiveX是这套规范的实现之一,更多详情参考官网。目前已经升级到第三个大版本RxJava 3,包含下面几个主要类:
- io.reactivex.rxjava3.core.Flowable: 0…N个流,支持反应流和回压
- io.reactivex.rxjava3.core.Observable: 0…N个流,没有回压
- io.reactivex.rxjava3.core.Single: 1个流
- io.reactivex.rxjava3.core.Completable: 0个流
- io.reactivex.rxjava3.core.Maybe: 0或1个流
Publisher
其中,只有io.reactivex.rxjava3.core.Flowable实现了org.reactivestreams.Publisher<T>
接口,其他四种流类型没有实现。
Processor
实现 | 说明 |
---|---|
PublishProcessor | 广播处理器,多个发布者,多个订阅者,0个订阅者也发布消息,发布者在同一个线程发布消息 |
MulticastProcessor | 广播处理器,多个发布者,多个订阅者,没有订阅者时不发布消息(自动取消) |
ReplayProcessor | 重播处理器,多个发布者,多个订阅者 |
UnicastProcessor | 单播处理器,多个发布者,一个订阅者 |
BehaviorProcessor | 类似重播处理器,但仅重播最近一次消息和后续所有消息 |
AsyncProcessor | 类似重播处理器,但仅重播最近一次消息和结束消息 |
SerializedProcessor | 所有方法加锁串行化,实现线程安全 |
Reactor实现
Reactor也是这套规范的实现之一,Spring webflux使用了基于这个库实现的rectory-netty框架。更多信息参考官网。
Publisher
Reactor包含两个主要响应式流类:
reactor.core.publisher.Flux<T>
:0…N个流reactor.core.publisher.Mono<T>
:0或1个流
两个都是实现了org.reactivestreams.Publisher<T>
接口。
Processor
实现 | 说明 |
---|---|
DirectProcessor | 广播处理器,多个发布者,多个订阅者,0个订阅者也发布消息,发布者在同一个线程发布消息 |
EmitterProcessor | 广播处理器,多个发布者,多个订阅者,没有订阅者时不发布消息(自动取消) |
ReplayProcessor | 重播处理器,多个发布者,多个订阅者 |
UnicastProcessor | 单播处理器,多个发布者,一个订阅者 |
TopicProcessor | 异步消息处理器,使用环形缓冲实现订阅发布模式,多个订阅者时,订阅后,每个订阅者处理所有后续消息;遵守Reactive Streams协议 |
WorkQueueProcessor | 异步消息处理器;使用环形缓冲实现工作队列模式,多个订阅者时,每个订阅者只处理部分消息;部分遵守Reactive Streams协议 |